C++ C++;处理const double&;那是指一个int?

C++ C++;处理const double&;那是指一个int?,c++,reference,C++,Reference,今天早上我正在编写一些模板代码,我使用了一个BOOST\u STATIC\u ASSERT来确保我没有创建对错误类型的引用,因为我认为这可能是一个更清晰的错误消息。然而,当我尝试删除静态断言以查看替代编译器错误时,我震惊地发现,当您尝试使常量为double时,gcc甚至没有抱怨&引用int: #include <iostream> int main() { int x = 5; const double& y = x; std::cout <&

今天早上我正在编写一些模板代码,我使用了一个
BOOST\u STATIC\u ASSERT
来确保我没有创建对错误类型的引用,因为我认为这可能是一个更清晰的错误消息。然而,当我尝试删除静态断言以查看替代编译器错误时,我震惊地发现,当您尝试使常量为double时,gcc甚至没有抱怨&引用int:

#include <iostream>

int main()
{
    int x = 5;
    const double& y = x;
    std::cout << y << std::endl;

    return 0;
}
这是怎么回事?这是未定义的行为吗?如果是这样,为什么gcc不抱怨?在我的机器上,int是4字节,double是8字节。这意味着当打印double时&它应该将该地址的8个字节解释为double并打印它,但实际上在该位置有一个4字节的int


非常困惑。救命啊

const T&
可以绑定到临时文件,因此
x
将被转换为
double
,副本绑定到
y
。如果您选中,您将看到
&x!=&y
。这种行为的原因是允许将文本传递给通过
const
引用获取其参数的函数。

这是定义良好且合法的<代码>y指的是临时代码。在传递参数时也要考虑:

void foo(const int& p);
foo(3.14);

注意,如果引用不是const,这不是有效的C++。VS6错误地将可变引用绑定到临时引用。这仅适用于常量引用。

constdouble&y=x
使用值
static_cast(x)
创建一个临时
双精度
,然后将该临时值绑定到
y
。临时文件的生存期将延长,以匹配
y
的生存期


这是完全合法的C++(03和11),因此缺少警告/错误。

< P>这对于那些认为指针和引用是相同的人来说是一个很好的例子。
double const*const y2 = &x;

gives
bad.cpp:7:30: error: cannot convert ‘int*’ to ‘const double* const’ in initialization

其他帖子解释了它对引用有效的原因。

Well,不是“复制已存储”,
y
绑定到转换后产生的临时值,因为它是常量左值引用。@CatPlusPlus:将“存储在”替换为“绑定到”,如果不澄清,至少要学究正确:可怕的。事实上,在你回答之前,我通过观察当你增加x,然后打印y时会发生什么情况,找到了答案。它没有改变,所以我想——“当然!它绑定到一个临时文件!”。另外,gcc也接受-std=c++98,所以我猜它也是有效的c++98?@Mozza314:“我猜它也是有效的c++98?”是的;我手头上没有这个特定标准的副本,但我相当确定这不是C++03中添加的内容之一。但是请记住,
-std=c++98
实际上执行的是c++03规则,而不是c++98规则,参数名称无法承受。我不明白。。。当绑定到临时变量而不是
constdouble
时,为什么要执行
constdouble&
?@Mehrdad:我不相信这有任何实际用途,但它是合法的。@Mozza314:事实上,我指的是使用局部(非参数)变量执行此操作的上下文。了解在更常见的场景(例如参数传递)中如何定义行为绝对是一件好事。:-]添加
x=42时会发生什么
常数双精度&y=x?乍一看可能很奇怪/出乎意料。
double const*const y2 = &x;

gives
bad.cpp:7:30: error: cannot convert ‘int*’ to ‘const double* const’ in initialization