struct Foo {};
struct Bar : Foo {};
Foo &foo = Bar(); // without const
正如在question的答案和评论中写的那样,我无法为引用分配右值。但是,我可以编译此代码(MSVC ++ 2010)而不会出现错误或警告。这是我的编译器的已知问题吗?
答案 0 :(得分:10)
Temporaries不绑定到非常量引用。这就是语言设计的方式。
虽然原则上没有任何技术障碍允许不间断地访问临时设备,但这几乎总是设计不佳,并且经常出现逻辑错误,因此标准不允许这样做。如果您觉得需要修改临时版,则应重新考虑为什么要这样做。
答案 1 :(得分:1)
您正在为参考分配临时值。这是暂时的,因为在这里,Bar()
就像一个函数返回一个Bar
实例,它将在表达式范围内蒸发,这就是行尾。这是非常危险和非法的,因为解除引用foo
会产生未定义的行为。我不知道为什么MSVC ++允许这个“功能”必须是一个可靠的错误。
警告级别为4(/ W4),您将获得
warning C4239: nonstandard extension used : 'initializing' : conversion from 'Bar' to 'Bar &'
您应该始终编写警告级别为4的代码 最后,@ KerrekSB的答案比我的好,你应该选择他的答案。