以下代码使用Clang(测试3.9.1)和GCC(6.3测试)编译,如此链接所示:https://godbolt.org/g/kO1nBa。但是,MSVC(已测试19.00.24215.1)无法编译它:
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 {size = 1})'
这里发生了什么 - 标准是否允许这样做?这是C ++ 17的功能吗?
另外,我将如何解决这个问题?我需要成员初始化基类的行为(因为有些东西我省略了涉及宏等等。)。
答案 0 :(得分: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,但执行相同操作的复制构造函数不支持。