【发布时间】:2013-05-11 03:44:24
【问题描述】:
我知道在 c++03 中,非常量引用不能绑定到右值。
T& t = getT(); 无效,在 c++11 中,我们可以这样做:T&& t = getT(); 但是上面的代码呢,在 c++11 中应该可以工作吗?
我用vs11测试了下面的代码:
Foo getFoo() {
return Foo();
}
void fz(Foo& f) {
}
int getInt() {
return int();
}
void iz(int& i) {
}
int main() {
{
Foo& z = getFoo(); //ok
fz(getFoo()); //ok
int& z2 = getInt(); //error: initial value of reference to non-const must be an lvalue
iz(getInt()); //same as above
}
}
Foo是一个自定义类,我不明白为什么前两行编译。z引用的临时在main的内部范围的末尾被破坏。标准对此有何规定?
class Foo {
public:
Foo() {
std::cout << "constructed\n";
}
~Foo() {
std::cout << "destructed\n";
}
};
刚刚看到一个类似的问题:One VS2010 bug ? Allowing binding non-const reference to rvalue WITHOUT EVEN a warning?
【问题讨论】:
-
有趣的是,很少 Objective-C 或 Java 程序员会询问有关面向语言的深奥问题,例如“将右值绑定到非 const 左值引用是否有效...... ?”或者必须关心诸如“临时引用......在内部范围的末尾被破坏”之类的东西。只是说';)
-
你能发布你是如何定义 Foo 的吗?
-
绑定规则没有改变左值引用AFAIK
-
@paulsm4:抱歉,我没有时间阅读您的评论,我正忙于等待您的垃圾收集器完成。
-
@paulsm4 Objective-C 并不总是有自动引用计数,你知道的。在引入之前有很多混乱。
标签: c++ visual-studio-2012 c++11 lvalue rvalue