2016-06-26 2 views
2

テスト関数は、コピー/移動コンストラクタ、コピー/移動代入演算子またはコピーエリジョンを使用せずに値を返しています(g ++ 4.8.4では-fno-elide -constructors)コピー/移動またはコピーエリジョンを使用しない値を返す関数

struct Test 
{ 
    Test() {} 
    Test(const Test&) = delete; 
    Test(Test&&) = delete; 
    Test& operator = (const Test&) = delete; 
    Test& operator = (Test&&) = delete; 
    void fn(){} 
}; 

Test test() { 
    // error: use of deleted function ‘Test::Test(Test&&)’ 
    // return Test{}; 

    // However, this compiles (g++ 4.8.4 and g++ 6.1.0) 
    return {}; 
} 

int main() { 
    test().fn(); 

    // In any case 
    // error: use of deleted function ‘Test::Test(Test&&)’ 
    // Test t{test()}; 
} 

はコードが有効であり、そうであれば、return {}の効果は何ですか?

答えて

4

[stmt.return]/1 ... returnステートメントブレース-INIT-リストを 8.5(オブジェクトまたは参照がコピーリスト初期化することによって関数から返される初期化します。 4)指定された初期化子リストから...

+0

コンストラクタTest(int)でテストを行いました。 –

関連する問題