none
コピーコンストラクタでC2535 RRS feed

  • 質問

  • VC2012まで動いていた次のコードが、
    VC2013から動かなくなりました。

    ●再現コード
    struct  sample
    {
        sample(sample const& = x);
        sample(int);
        static  const   sample  x;
    };  //C2535

    ●対照実験
    struct  sample
    {
        sample(sample const&);
        sample(sample const& = x);  //C2535
        sample(int);
        static  const   sample  x;
    };

    C2535の「メンバー関数は、既に定義または宣言されています」という指摘のとおり、対照実験ではコピーコンストラクタを再宣言した位置でC2535となります。

    ところが、再現コードではクラス定義を終了させた位置でC2535となっています。

    ★質問
    1. これは、trivial copy constructorとの衝突ですか。
    2. 1.が「はい」の場合、そのような変更の根拠としたISO/IEC 14882の箇条またはWG21のissue/reportがあれば教えて下さい。「ない」という回答も有効な情報としてお待ちしております。

    [コンパイラのバージョン]
    Microsoft(R) C/C++ Optimizing Compiler Version 17.00.60610.1 for x86
    Microsoft(R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x86

    2014年7月13日 1:46

すべての返信

  • ひとまず手元のVS2013 Update2(Microsoft(R) C/C++ Optimizing Compiler Version 18.00.30501 for x86)でも再現しました。

    よくわからず書きますが、コピーコンストラクタのデフォルト引数を実現するに当たって、再度コピーコンストラクタが必要になってそれでtrivial copy constructorが用意され、それがユーザー定義バージョンと競合する、ということでしょうか。

    デフォルト引数ということはデフォルトコンストラクタも兼ねるつもりでしょうか? 意味的には

    struct  sample
    {
    	sample() : sample(x){}
    	sample(sample const&);
    	sample(int);
    	static  const   sample  x;
    };

    ですよね。バグなのかなぁ…?

    追加で

    Microsoft(R) C/C++ Optimizing Compiler Version 18.00.30626 for x86
    Microsoft(R) C/C++ Optimizing Compiler Version 19.00.21901.1 for x86

    でも同じエラーになりました。報告した方がいいかも。

    • 編集済み 佐祐理 2014年7月13日 7:09 追加評価
    2014年7月13日 4:44
  • http://msdn.microsoft.com/en-us/library/hh567368.aspx

    によると、2012と2013の違いは

    1.Non-static data member initializers
    2.Variadic templates v0.9, v1.0
    3.Initializer lists
    4.Default template arguments for function templates
    5.Alias templates
    6.Delegating constructors
    7.Explicit conversion operators
    8.Raw string literals
    9.Defaulted and deleted functions

    になるかと思います。
    これらの実装のため他の部分にも影響が出ているのかもしれませんが、
    手元にVS2013をインストールできないので試せません。あしからず。

    2014年7月14日 2:00
  • 暇だったので仕様を読んでみての感想です・・・。

    ★質問

    1. これは、trivial copy constructorとの衝突ですか。
    2. 1.が「はい」の場合、そのような変更の根拠としたISO/IEC 14882の箇条またはWG21のissue/reportがあれば教えて下さい。「ない」という回答も有効な情報としてお待ちしております。

    1. → たぶん「はい」でしょう。

    2. → 12.8.4 項あたりからです。

    読んでる仕様書も違ってるような気もするので、たんなる個人見解です。

    直接的な表現は見当たらなかったですが、コンストラクタとコピーコンスタラクタ関係の内容読むと、VS2013 以降の動作の方が仕様に添ってる感じはしますが・・・。

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    仕様でできない明記もないので、VS2013 でも書き方変えれば動くようにできる感じですが、穴を突いてる不安なコードに思えるので、危なげないコードに変更する方がよいと思いますが・・・。

    仲澤@失業者 様が指摘してる内容に初期化関係の修正もありますから、単に影響がでたバグの可能性もありますから・・・。

    単に自分が無知なだけで、意外とよくあるコードなのですかね・・・?

    • 編集済み kyano30 2014年7月15日 3:39 追記
    2014年7月14日 15:49