如果有一个类持有引用,我希望以下代码会惨败,但它可以编译:
#include <iostream>
struct ReferenceHolder
{
std::string& str;
ReferenceHolder(std::string& str)
: str(str)
{}
};
// Why does this compile?
ReferenceHolder f() {
std::string str = "Hello";
return ReferenceHolder(str);
}
int main() {
ReferenceHolder h = f();
std::cout << "Should be garbage: " << h.str << '\n';
return 0;
}
编译器:g++ 4.7.2(带有-std=c++11)
Edit:即使使用 -fno-elide-constructors 它也能愉快地编译
正如您的示例所示,复制初始化您的类没有问题:新引用只是初始化为引用与旧引用相同的对象。当然,当函数返回使引用悬空时,您会得到未定义的行为。
该引用可防止默认初始化和复制分配;因此,由于这些原因,以下小更改将失败:
ReferenceHolder h; // ERROR: can't default-initialise the reference
h = f(); // ERROR: can't reassign the reference.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)