Foo& foo = Bar()是合法的还是编译器问题

时间:2011-10-31 13:08:37

标签: c++ visual-c++ reference visual-c++-2010

struct Foo {};
struct Bar : Foo {};

Foo &foo = Bar(); // without const

正如在question的答案和评论中写的那样,我无法为引用分配右值。但是,我可以编译此代码(MSVC ++ 2010)而不会出现错误或警告。这是我的编译器的已知问题吗?

2 个答案:

答案 0 :(得分:10)

Temporaries不绑定到非常量引用。这就是语言设计的方式。

虽然原则上没有任何技术障碍允许不间断地访问临时设备,但这几乎总是设计不佳,并且经常出现逻辑错误,因此标准不允许这样做。如果您觉得需要修改临时版,则应重新考虑为什么要这样做。

答案 1 :(得分:1)

您正在为参考分配临时值。这是暂时的,因为在这里,Bar()就像一个函数返回一个Bar实例,它将在表达式范围内蒸发,这就是行尾。这是非常危险和非法的,因为解除引用foo会产生未定义的行为。我不知道为什么MSVC ++允许这个“功能”必须是一个可靠的错误。

警告级别为4(/ W4),您将获得

warning C4239: nonstandard extension used : 'initializing' : conversion from 'Bar' to 'Bar &'

您应该始终编写警告级别为4的代码 最后,@ KerrekSB的答案比我的好,你应该选择他的答案。