6

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 参照のバインドを許可しますか?

4

2 に答える 2