2

次のコードに対して警告が表示されますが、バリアントから boost::blank を削除すると消えます。

namespace DB
{
struct Value{};
struct Container{};
}

typedef boost::variant <boost::blank, DB::Value, DB::Container> CommandData;

struct Command {
    explicit Command(CommandData& _data): data(_data){
    }

    CommandData data;
};

int main()
{
    CommandData commandData;
    Command command(commandData);
    return 0;
}

この問題は何ですか?

警告は次のとおりです。

1>: warning C4345: behavior change: an object of POD type constructed with an initializer of the form () will be default-initialized
1>          c:\boost_1_49_0\boost\variant\variant.hpp(1224) : while compiling class template member function 'boost::variant<T0_,T1,T2>::variant(void)'
1>          with
1>          [
1>              T0_=boost::blank,
1>              T1=DB::Value,
1>              T2=DB::Container
1>          ]
1>          c:\code.h(38) : see reference to class template instantiation 'boost::variant<T0_,T1,T2>' being compiled
1>          with
1>          [
1>              T0_=boost::blank,
1>              T1=DB::Value,
1>              T2=DB::Container
1>          ]
4

2 に答える 2

7

その警告はかなりばかげています。これは、MSVCが古いバージョンとは対照的に正しいことを行うようになったことを警告しています。でオフにできますpragma

于 2012-10-22T15:32:36.270 に答える
0

バリアントのせいではありません。たとえば、int をバリアントの代わりに構造体メンバーとして配置しようとすると、同じ警告が表示されます。問題は、バリアントがデフォルトで最初の値で初期化され、boost::blank がバリアントの動作を最適化する特殊な型であることです。Boost のバリアント ドキュメントを参照してください

于 2012-10-22T15:23:04.843 に答える