constexpr构造函数引用基类在编译器之间有所不同

时间:2017-02-11 10:00:28

标签: c++ visual-c++ clang language-lawyer standards

以下代码使用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的功能吗?

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

1 个答案:

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