首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板参数的引用变量所引发的问题

模板参数的引用变量所引发的问题
EN

Stack Overflow用户
提问于 2010-08-22 17:27:44
回答 1查看 1.6K关注 0票数 6

下面的小示例显示了我的问题:

代码语言:javascript
复制
template<class T> struct X
{
    static void xxx(T& x) { }
    static void xxx(T&& x) { }
};

int main(int argc, char** argv)
{
    int x = 9;
    X<int>::xxx(x); // OK.
    X<int&>::xxx(x); // ERROR!
    return 0;
}

错误信息(GCC):

错误:“T=int&的静态void::xxx(T&&)”不能重载

错误:使用“静态空X::xxx(T&)和T=int&”

为什么?T = int& -> T&static void xxx(T& x)中的int&&所取代?

如果问题的答案是肯定的,那么:

  • T&不是一个lvalue引用,它变成了一个rvalue-reference!
  • And,下面的代码应该可以工作:

但事实并非如此:

代码语言:javascript
复制
template<class T> struct X
{
    static void xxx(T& x) { }
};

int main(int argc, char** argv)
{
    X<int&>::xxx(2); // ERROR!
    return 0;
}

错误信息(GCC):

错误:对‘X::xxx(Int)’的调用没有匹配函数

注:候选人为:静态void::xxx(T&)与T= int&

T&T = int&不等于T&&,也不是rvalue引用。但如果不是,为什么第一个例子不起作用呢?(这是一个递归问题!)

但是,指针类型没有出现类似的问题:

代码语言:javascript
复制
#include <iostream>

template<class T> struct X
{
    static void xxx(T* x) { std::cout << **x << std::endl; }
};

int main(int argc, char** argv)
{
    int x = 10;
    int* xx = &x;
    X<int*>::xxx(&xx); // OK. call X<int*>::xxx(int**)
    return 0;
}

为什么引用在这种行为中是不同的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-22 17:51:15

C++11语言标准在§8.3.2dcl.ref/6 (为可读性重新格式化)中解释了这一工作原理:

如果类型模板参数或解密类型-speci

er表示对类型T的引用的类型TR,则为

创建类型“cv T"

  • an的lvalue引用”的尝试创建类型"lvalue引用到T

  • an”尝试创建类型"rvalue引用到cv TR“创建类型TR.

让我们考虑一下您的示例(我已将您的T重命名为TR,因此它与上面的语言相匹配):

代码语言:javascript
复制
template<class TR> struct X
{
    static void xxx(TR& x)  { }
    static void xxx(TR&& x) { }
};

如果我们尝试用X (so,T = int)实例化TR = int&,那么xxx的实例化如下:

代码语言:javascript
复制
static void xxx(TR& x)  { }   -->   static void xxx(int& x) { }
static void xxx(TR&& x) { }   -->   static void xxx(int& x) { }

在第一种情况下,我们尝试创建一个“TR的lvalue引用”,它变成了“T的lvalue引用”,Tint,所以参数类型变成了int&

在第二个例子中,我们尝试创建一个“对TR的rvalue引用”,它变成了TR,也就是int&

参数类型对于两个重载都是相同的,因此出现了错误。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3542497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档