2017-02-11 81 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 {(空)}},{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,但复制做同样的事情建设者都没有。

相关问题