Pie*_*rre 6 c++ constexpr c++11
让我们看一下这段代码示例:
class D
{
public:
constexpr D(int val) : i(val) { };
~D() { };
private:
int i;
};
D d(3);
Run Code Online (Sandbox Code Playgroud)
根据文档,D应该被常量初始化:
只有以下变量会被常量初始化:[...]
2.如果构造函数是constexpr并且所有构造函数参数(包括隐式转换)都是常量表达式,则通过构造函数调用初始化的类类型的静态或线程本地对象并且如果构造函数的初始值设定项列表中的初始值设定项和类成员的花括号或等号初始值设定项仅包含常量表达式。
事实上,d通过构造函数调用初始化的构造函数D就是constexpr和我的观点(3)是一个常量表达式。
但是,要指定编译器可以在编译时评估变量的值,可以使用constexprspecifier。但是,在这种情况下,由于D不是LiteralType,所以不会编译,因为它定义了一个非平凡的构造函数。
因此,在我的代码段中,是否d真的对常量进行了初始化?如果是这样,为什么我不能使用constexpr说明符?
那么,在我的代码片段中,
d常量真的被初始化了吗?如果是这样,为什么我不能使用constexpr说明符?
是的,它将被常量初始化。正如您所引用的,常量初始化不需要类型是 LiteralType。但constexpr确实需要它。您的类型不是 LiteralType,因此它不能是constexpr. 但类型和构造函数调用满足常量初始化的要求。
顺便说一句,C++20 将有constinit。这样,您可以确保变量得到静态初始化(这意味着在您的情况下是常量初始化)。
您可以在godbolt上查看 constinit 示例,作为其编译成功的进一步证据,并且您可以看到该对象在编译时初始化(不是标准要求,但 GCC 这样做)。
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |