当我使用编译以下代码时g++
class A {};
void foo(A&) {}
int main()
{
foo(A());
return 0;
}
我收到以下错误消息:
> g++ test.cpp -o test
test.cpp: In function ‘int main()’:
test.cpp:10: error: invalid initialization of non-const reference of type ‘A&’ from a temporary of type ‘A’
test.cpp:6: error: in passing argument 1 of ‘void foo(A&)’
经过一番思考,这些错误对我来说很有意义。A()
只是一个临时值,而不是堆栈上的可分配位置,因此它似乎没有地址。如果它没有地址,那么我就无法引用它。好的。
可是等等!如果我将以下转换运算符添加到类A
class A
{
public:
operator A&() { return *this; }
};
那么一切都很好!我的问题是这是否远程安全。什么this
时候A()
被构造为临时值?
我对以下事实充满信心
void foo(const A&) {}
可以根据g++
我使用的所有其他编译器接受临时值。const
关键字总是可以被抛弃,所以如果const A&
参数和参数之间存在任何实际的语义差异,我会感到惊讶A&
。所以我想这是问我问题的另一种方式:为什么const
对编译器认为安全的临时值的引用而不是非const
引用?