【发布时间】:2017-12-17 17:16:15
【问题描述】:
在 C++ 中,您可以将许多东西声明为 constexpr:变量、函数(包括成员函数和运算符)、构造函数,并且从 C++1z 开始,还可以声明 if statements 和 lambda expressions。但是,声明 destructor constexpr 会导致错误:
struct X {
constexpr ~X() = default; // error: a destructor cannot be 'constexpr'
};
我的问题:
- 为什么不能将析构函数标记为
constexpr? - 如果我不提供析构函数,是隐式生成的析构函数
constexpr? - 如果我声明了一个默认析构函数 (
~X() = default;),它会自动constexpr吗?
【问题讨论】:
-
对于 (1),请澄清您是否在询问标准中的哪个位置说析构函数不能是 constexpr;或者如果您询问该规则的基本原理
-
@M.M 我主要感兴趣的是在标准中它说析构函数不能是 constexpr,但也很高兴知道该规则的基本原理。
-
constexpr对析构函数有用吗?我想不出一个令人信服的例子来让一个程序受益。 -
一个例子是尝试用填充子类化一个结构,这样填充就被优化掉了(见stackoverflow.com/questions/24110347)。如果将非默认 dtor 添加到基结构(以优化填充),则派生类不能是 constexpr,因为它的 dtor 不会是 constexpr。
标签: c++ language-lawyer constexpr