C++如何处理const double并引用int?

vol*_*evo 17 c++ reference

我今天早上正在研究一些模板代码,我用它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),因此缺少警告/错误.

  • @ Mozza314:的确,我指的是使用本地(非参数)变量执行此操作的上下文.知道如何在更常见的场景中定义行为(例如参数传递)绝对是一件好事.: - ] (2认同)

jus*_*tin 11

它定义明确,合法.y是指临时的.传递参数时也要考虑:

void foo(const int& p);
foo(3.14);
Run Code Online (Sandbox Code Playgroud)

另请注意,如果引用不是const,则这不是有效的C++ .VS 6得到了错误并允许将可变引用绑定到临时引用.这仅适用于const引用.