これは機能します:
class Foo {};
void external_function(Foo&);
void f() {
Foo b;
external_function(b);
}
これはしません:
class Foo {};
void external_function(Foo&);
void f() {
external_function(Foo());
}
クランは次のように述べています。
aac.cc:3:6: note: candidate function not viable: no known conversion from 'Derived' to 'Base &' for 1st argument;
GCC は、実際には次の場合により役立ちます。
aac.cc:7:30: error: invalid initialisation of non-const reference of type ‘Base&’ from an rvalue of type ‘Derived’
Herb Sutter ( http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ ) は、非 const 参照は右辺値に使用できないと述べています。彼の例では意味がありますが、私のものでは意味がありません。オブジェクトは external_function() 呼び出しの間存在するからですよね?
私はそれを機能させる方法を知っています。(上記のように) 右辺値にならないように名前付きオブジェクトを作成するか、const ref を使用します。しかし、私には安全だと思われるため、許可されていない理由を知りたいです。