【发布时间】:2015-01-06 20:16:05
【问题描述】:
我正在关注一些 C++ 教程,但令人沮丧的是,源材料指出无法进行此特定函数调用,但根本没有解释原因;
template<typename T>
void Swap(T &a, T &b){
T temp;
temp = a;
a = b;
b = temp;
}
所以现在我创建一个显式模板函数实例化并传入a 和b;
int a = 5;
double b = 10.3;
Swap<double>(a, b);
然后引发以下编译器错误;
无法将“a”(类型“int”)转换为类型“double&”
我唯一的预感是,这是因为规定右值不能绑定到非常量引用的规则,但是,如果 T &a 只是一个别名,它本身就不是右值,是吗?我的隐式演员正在创建一个临时的,它不能绑定到T &a?是这样吗?
temp 是一个左值。它可能只有功能范围,但确实存在。那么为什么不允许隐式转换加倍,然后将引用 a 分配给temp?意图看起来很清楚。我不太理解作为参数的引用。如果 a 被分配给 temp,这是一个左值,那么这不是允许的吗?
这是假设我什至在正确的轨道上。
编辑:
第二个例子;
int a = 5;
double &d = a; // invalid initialization of reference of type 'double&' from expression of type 'int'
但是;
int a = 5;
const double &d = a; //valid
【问题讨论】:
-
一个
double引用需要一个double变量来引用。 -
你希望
a的值在交换之后是多少? -
@Paul Roub - 但是 C++ 不会隐式地将 int 强制转换为 double 以匹配引用类型吗?还是仅在变量的情况下如此?
-
@MartynShutt (变量或文字的)值可以通过强制转换进行转换,但在这里您需要传递一个双精度变量才能在函数内部使用。不仅仅是双重价值。该函数可以对它做任何事情,例如。分配双精度值或获取双精度指针
-
这样说吧。你会写:
int a; double &b = a;?如果是这样,您不清楚参考文献 是什么。