c++03 では、非 const 参照を右辺値にバインドできないことを知っています。
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
はカスタム クラスですが、最初の 2 行がコンパイルされる理由がわかりませんz
。規格はこれについて何か言っていますか?
class Foo {
public:
Foo() {
std::cout << "constructed\n";
}
~Foo() {
std::cout << "destructed\n";
}
};
同様の質問を見たところです: One VS2010 bug ? 警告なしで rvalue への非 const 参照のバインドを許可しますか?