引用基类的 constexpr 构造函数因编译器而异



以下代码使用 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:表达式的计算结果未达到常量

注意:失败是由分配操作的评估引起的

注意:在评估'ExtraResidentsValueWitnessTable::ExtraResidentsValueWitnessTable(ExtraResident ValueWitnessTable{

ValueWitnessTable{(null(}}, ValueWitnessTable{size=1}('

这是怎么回事——标准允许吗?这是 C++ 17 功能吗?

另外,我将如何解决这个问题?我需要按成员初始化基类的行为(因为我省略了一些涉及宏等的东西(。

所以我找到了这个问题的解决方案:改用初始值设定项列表:

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 受支持,但执行相同操作的复制构造函数则不支持。

相关内容

最新更新