gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:06:18 31 4
gpt4 key购买 nike

以下代码使用 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() {}

error C2131: expression did not evaluate to a constant

note: failure was caused by evaluation of an assignment operation

note: while evaluating 'ExtraInhabitantsValueWitnessTable::ExtraInhabitantsValueWitnessTable(ExtraInhabitantsValueWitnessTable{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 被支持,但做同样事情的复制构造函数不被支持。

关于c++ - 引用基类的 constexpr 构造函数因编译器而异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42174564/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com