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