2017-02-11 6 views
1

次のコードは、このリンクに示すように、Clang(3.9.1テスト済み)とGCC(6.3テスト済み)でコンパイルされます:https://godbolt.org/g/kO1nBa。しかし、MSVC(19.00.24215.1がテストした)、それをコンパイルに失敗:基本クラスを参照するconstexprコンストラクタはコンパイラによって異なります

struct ValueWitnessTable { 
    int size; 
}; 

struct ExtraInhabitantsValueWitnessTable : ValueWitnessTable { 
    constexpr ExtraInhabitantsValueWitnessTable(const ValueWitnessTable &base) : ValueWitnessTable(base) {} 
}; 

struct ValueWitnessTableGenerator { 
    static constexpr const ExtraInhabitantsValueWitnessTable table = { { 1 } }; 
}; 

int main() {} 

エラーC2131:式が定数

ノートに評価されていなかった:失敗が代入演算

の評価によって引き起こされました

注:評価中 'ExtraInhabitantsValueWitnessTableを:: ExtraInhabitantsValueWitnessTable(ExtraInhabitantsValueWitnessTable {ValueWitnessTable {(NULL)}}、{ValueWitnessTableサイズ= 1})'

ここでは何が起こっているのですか?基準によって許可されていますか?これはC++ 17の機能ですか?

また、この問題を回避するにはどうすればよいですか?私は基本クラスの初期化の振る舞いが必要です。なぜなら、マクロなどを含めて省略したものがあるからです。

+0

cppreferenceから引用:非スタティックメンバーと基本クラスを初期化するために選択されたすべてのコンストラクタは、constexprコンストラクタでなければなりません。あなたが望むならば、C++ 14 – felix

+0

@felix知っておいてください - お気軽にお答えください!このMSVCの制限を回避する方法を知っていますか –

答えて

0

は、だから私はこの問題の解決策を考え出した:代わりに初期化子リストを使用します。何らかの理由で初期化子リストでは

struct ValueWitnessTable { 
    int size; 
}; 

struct ExtraInhabitantsValueWitnessTable : ValueWitnessTable { 
    constexpr ExtraInhabitantsValueWitnessTable(const ValueWitnessTable &base) : ValueWitnessTable{base.size} {} 
}; 

struct ValueWitnessTableGenerator { 
    static constexpr const ExtraInhabitantsValueWitnessTable table = { { 1 } }; 
}; 

int main() {} 

をconstexprのようサポートしますが、同じことを行うコンストラクタはありませんコピーされています。

関連する問題