2

次のコードがあります。

struct X
{
    int a, b;
};

class Y
{
public:
    Y(const X& x) : x_{x} {};  // C2797 error

private:
    X x_;
};

MSVC2013 Update 3 でコンパイルすると、C2797 エラーが発生します。中括弧を括弧 (つまりx_(x)) に置き換えると、プログラムは正常にコンパイルされます。

なぜこれが起こるのですか?このコンパイラの動作は C++11 に準拠していますか? C++14 はどうですか?

編集:より明確にするために、x_{x}上記が標準に従って呼び出すX(std::initializer_list)必要があるかどうか、またはそれが呼び出しの有効な構文であるかどうかはわかりませんX(const X&)。私の知る限り、後者です。私は正しいですか?

4

2 に答える 2

2

標準から:

— T が集合体の場合、集合体の初期化が実行されます。

[...]

— それ以外の場合、T がクラス型の場合、コンストラクターが考慮されます。適用可能なコンストラクターが列挙され、オーバーロード解決 (13.3、13.3.1.7) によって最適なコンストラクターが選択されます。引数のいずれかを変換するために縮小変換 (以下を参照) が必要な場合、プログラムは不適切な形式です。

上記のコンテキストでは、 は集計x_{x}であるため、コピー コンストラクターを呼び出しません。X集約の初期化を試みます。これは次のとおりです。

  • MSVC では、実装されていません。XMSVC は、集合体ではないisの場合にもコンパイルに失敗するように見えるためstd::string、C++11 準拠の問題がいくつかある可能性があります。

  • gcc では実装されていますが、プログラムの形式が正しくなく、コンパイルできません{int, int}( {const X}.

于 2014-10-26T10:18:18.520 に答える