#include<iostream>
using namespace std;
struct B{};
struct A
{
A(const B &)
{
cout<<"A(const B &)"<<endl;
}
A(B &&)
{
cout<<"A(B &&)"<<endl;
}
};
A get()
{
B b;
return b;
}
int main()
{
get();
}
私はVC++ 14.2とGCC 5.4.0を使用してコードをテストし、それらの両方が出力:この場合、r値参照コンストラクタが呼び出されるのはなぜですか?
A(B &&)
なぜ
A(const B &)
出力はありますか?
このコードは、copy elision
と関連がありますか? (ただし、AとBは異なるタイプなので、copy elision
はここでは働かないはずです)
これは実際には非常に興味深い質問です。私は12.8/32の文言がやや不明であることを知っています:規則が適用されるためには、戻り式の型が関数の戻り値の型と同じでなければならないかどうかは不明です。私はあなたがそれを読み取ることができると思う*任意の*自動保存されたオブジェクトは、rvalueによって指定されたと見なされます。異なるコンパイラ[これについて別々に考える](http://melpon.org/wandbox/permlink/meIAgmvSOVq435vy)。 –
[CWG1579](http://wg21.link/cwg1579)がここに該当します。 –
@KerrekSB(31.1)によると、式が の名前である場合(関数パラメータまたはハンドラ(15.3)の例外宣言によって導入された変数を除く)の不揮発性自動オブジェクト(cv-qualificationを無視して)関数の戻り値の型として ''同じ型 'は 'return型'とまったく同じでなければならないと思います。つまり、 'A'オブジェクトを返すと' copy elision'が動作します。しかし、 'B'から' A'への暗黙的変換は ''コピーエリジョン ''の前に行われ、 ''コピーエリッション ''は ''暗黙の変換 ''に影響しないはずです。 – Caesar