我今天早上正在研究一些模板代码,我用它BOOST_STATIC_ASSERT来确保我没有创建错误类型的引用,因为我认为这可能是一个更清晰的错误消息.但是,当我尝试删除静态断言以查看替代编译器错误时,我惊讶地发现,当您尝试使const为double并引用int时,gcc甚至不会抱怨:
#include <iostream>
int main()
{
int x = 5;
const double& y = x;
std::cout << y << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译,甚至不警告:
$ g++ ~/stuff/badRef.cpp -Wall -Wextra -pedantic
$ a.out
5
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?这是未定义的行为吗?如果是这样,为什么gcc不抱怨?在我的机器上int是4个字节而double是8.这意味着当打印double时它应该将该地址的8个字节解释为double并打印它,但实际上在该位置有4个字节的int.
非常困惑.救命!
ild*_*arn 22
const double& y = x;double使用值创建临时值static_cast<double>(x),然后将该临时值绑定到y.临时的生命周期延长以匹配生命周期y.
这是完全合法的C++(03和11),因此缺少警告/错误.
jus*_*tin 11
它定义明确,合法.y是指临时的.传递参数时也要考虑:
void foo(const int& p);
foo(3.14);
Run Code Online (Sandbox Code Playgroud)
另请注意,如果引用不是const,则这不是有效的C++ .VS 6得到了错误并允许将可变引用绑定到临时引用.这仅适用于const引用.