2017-09-27 23 views
0

私はC++ Primer 5th editionを読んでいて、次の問題を抱えています。本書では、合成された移動操作が削除されたものとして定義されている場合がいくつか挙げられます。そのうちの1つは、 "コピーコンストラクタとは異なり、クラスに独自のコピーコンストラクタを定義するメンバがあるが、ムーブコンストラクタも定義していない場合、またはクラスに定義されていないメンバがある場合それ自身のコピー操作と、コンパイラが移動コンストラクタを合成することはできません。 と、次のようにデモ・コードを提供します。合成移動コンストラクタの動作

// assume Y is a class that defines its own copy constructor but not a move constructor 
struct hasY { 
    hasY() = default; 
    hasY(hasY&&) = default; 
    Y mem; // hasY will have a deleted move constructor 
}; 
hasY hy, hy2 = std::move(hy); // error: move constructor is deleted 

しかし、GCC 7.2.1と打ち鳴らす-900.0.37を両方のために、コードが実行可能である、本は間違っていますか?

#include <iostream> 

struct Y { 
    Y() { std::cout << "Y()" << std::endl; } 
    Y(const Y&) { std::cout << "Y(const Y&)" << std::endl; } 
    //Y(Y&&) { cout << "Y(Y&&)" << endl; } 
}; 

// assume Y is a class that defines its own copy constructor but not a move constructor 
struct hasY { 
    hasY() = default; 
    hasY(hasY&&) = default; 
    Y mem; // hasY will have a deleted move constructor 
}; 

int main() { 
    hasY hy, hy2 = std::move(hy); // error: move constructor is deleted 
    return 0; 
} 

答えて

0

本は正しくC++ 11規格で規定動作を説明します。ここでは

は、完全なテストコードです。しかし、規定された振る舞いは、C++ 14のように変更されました。Defect Report #1402 "Move functions too often deleted"

+0

ありがとうございました。 – fetag

関連する問題