当前位置: 首页 > 知识库问答 >
问题:

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

费德宇
2023-03-14

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

还有,我该如何解决这个问题?我需要按成员方式初始化基类的行为(因为我省略了一些涉及宏等的内容)。

共有1个答案

长孙永思
2023-03-14

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

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

 类似资料:
  • 样本1 样本2 我对第一个示例如何编译和传递静态断言感到困惑,而第二个示例未能按照constexpr defaulted default constructor中提到的编译,错误为。 尝试阅读以下内容,但无法理解第一个是如何工作的,另一个是如何工作的。http://eel.is/c草案/类别。ctor#类。违约ctor-4 默认的构造函数是默认的,并且没有被定义为删除,当它被odr使用([basi

  • 为什么下面没有编译: 如有需要,请提供更多详细信息: 我想将tmp传递给父构造函数

  • 为什么 C 编译器可以将函数声明为 constexpr,而 constexpr 不能是 constexpr? 例如:http://melpon.org/wandbox/permlink/AGwniRNRbfmXfj8r 输出: 为什么此行出错:

  • 我试图用Kotlin编写如下Java代码: 此代码编译并正确工作:生成一个和给出一个的实例。 以下是我在科特林的成就: 它可以工作,但在Java中,我可以在枚举构造函数中使用构造函数引用。当我尝试在科特林做同样的事情时,也就是 我发现以下编译错误: 类型不匹配:推断的类型为KFunction0,但应为供应商 没有显式类型的lambda也不起作用: 给予 类型不匹配:推断类型是()- 问题是:静态编

  • 我有一个带有两个64位整数成员的结构X,以及一个构造函数:

  • 我制作了一个两个类,构造类和main方法,其中我从用户输入中读取一个数字,并吐出该数字的素数分解,代码是用Java编写的。 主要方法: 这是我的课: