ルック:クラスの戻り値の型を持つ関数内のreturn文で*&オブジェクトを返すときに、コピー/移動エリーションは許可されていますか?このコードでは
:許可/移動エリジオンをコピー
#include <stdio.h> struct Foo { Foo() { } Foo(const Foo &) { printf("copy\n"); } Foo(Foo &&) { printf("move\n"); } }; Foo getFoo() { Foo f; return *&f; } int main() { getFoo(); }
C++ 14標準が言う(12.8/31) 式が、ファンクションの戻り値の型として同じ型の 型の不揮発性自動オブジェクト( ファンクションまたはキャッチ節パラメータ以外)の名前である場合、コピー/移動操作は を省略することができます自動的にオブジェクトをに直接組み込むことによって関数の戻り値
私の例では、戻り式は名前ではないため、elisionは許可されていません。
私はGCC/clang/MSVCをチェックしていますが、clang/MSVCはコピーを消去しませんが、GCCはそれを行います。 GCCはここで標準に違反していますか?
なぜコンパイラが、 'と'& '演算子です。また、どのバージョンのコンパイラを使用していますか? C++ 14モードでビルドしていますか?また、標準を引用するときは、コードの元の場所(名前または章番号/セクション番号)を明記してください。 –
全く関係のないメモで、なぜあなたは出力に 'printf'を使用していますか?なぜ 'std :: cout'ではないのですか? –
@Someprogrammerdude - コンパイラは、おそらくそれらを放出されたコードに保持しません。しかし、それらは標準的な観点から表現の意味に影響を及ぼします。これは単純にid式(または名前)ではありません。 – StoryTeller