【问题标题】:Should I mark a compiler-generated constructor as constexpr?我应该将编译器生成的构造函数标记为 constexpr 吗?
【发布时间】:2013-12-28 02:26:22
【问题描述】:

做有没有区别:

X() = default;

constexpr X() = default;

在常量表达式中默认构造类可以正常工作,那么这两个示例之间有区别吗?我应该使用其中一个吗?

【问题讨论】:

  • 有人可能会提供建设性的答案,我不会从我找到信息的网站复制和粘贴。这是 constexpr 构造函数 部分en.cppreference.com/w/cpp/language/constexpr 中的一些指针
  • @woosah 如果您复制/粘贴,它仍然是一个有效的答案。
  • @remyabel 哦,我不知道。认为这有点像雅虎的回答:S
  • @woosah:是的,有点 :( 通常最好引用标准,但有时可以接受具有良好属性的二级来源。
  • @LightnessRacesinOrbit 我知道我会记住这一点

标签: c++ c++11


【解决方案1】:

由于在您的情况下,隐式构造函数实际上是 constexpr...

[C++11: 12.1/6]: [..] 如果用户编写的默认构造函数满足constexpr 构造函数(7.1.5)的要求,则隐式定义的默认构造函数为constexpr . [..]

[C++11: 7.1.5/3]:constexpr 函数的定义应满足以下约束:

  • 不应是虚拟的 (10.3);
  • 它的返回类型应该是文字类型;
  • 它的每个参数类型都应该是文字类型;
  • 它的函数体应该是= delete= default,或者一个复合语句,它只包含
    • 空语句,
    • static_assert-declarations
    • typedef 声明和 alias-declarations 不定义类或枚举,
    • 使用声明
    • 使用指令
    • 只有一个返回语句;
  • 用于初始化返回值(6.6.3、8.5)的每个构造函数调用和隐式转换都应是常量表达式(5.19)中允许的那些。

...声明实际上是等价的:

[C++11: 8.4.2/2]: 一个显式默认的函数只有在它被隐式声明为constexpr 时才可以被声明为constexpr,并且只有在它兼容的情况下才可以有一个显式的异常规范 (15.4) 带有异常规范 关于隐式声明。 如果函数在其第一个声明中明确默认,

  • 如果隐式声明是,则隐式认为是constexpr
  • 隐含地认为它具有与隐含声明 (15.4) 相同的 异常规范,并且
  • 在复制构造函数、移动构造函数、复制赋值运算符或移动赋值运算符的情况下,它应具有与隐式声明的参数类型相同的参数类型。

两者都行——没关系。

在一般情况下,如果您确实希望构造函数为constexpr,则最好将关键字保留在其中,以便在不符合条件时至少会出现编译器错误;忽略它,你可能会在不知不觉中得到一个非constexpr 构造函数。

【讨论】:

    猜你喜欢
    • 2018-10-04
    • 1970-01-01
    • 2012-10-21
    • 2020-09-25
    • 1970-01-01
    • 2022-09-23
    • 2018-10-01
    • 1970-01-01
    • 2014-03-12
    相关资源
    最近更新 更多