在常量初始化器中调用constexpr构造函数的限制
Restriction for invocation of constexpr constructor in a constant initializer
我不明白constexpr constructor
调用的以下添加:
对象0的常量初始化式是A的表达式常量表达式,除了它也可以调用constexpr构造函数用于0及其子对象,即使这些对象是of非文字类类型
Constexpr构造函数是核心常量表达式本身:
条件表达式e是核心常量表达式,除非对e求值,遵循抽象机(1.9)的规则,将计算下列表达式之一:
[…)
-一个调用对于文字类,除了constexpr构造函数之外的函数,一个constexpr函数,或者一个微不足道的函数的隐式调用析构函数(12.4)[…]
在后面的注释中有一个重要的提示:
[注:这样的类可以有一个非平凡的析构函数-结束注]
回想一下文字类类型(3.9p10):
- 有一个简单的析构函数
- 是一个聚合类型(8.5.1)或至少有一个constexpr构造函数或构造函数模板,不是复制或移动构造函数,并且
- 所有的非静态数据成员和基类都是非易失的文字类型。
因此,如果一个类有非平凡析构函数,它就不能成为一个文字类,但是调用它的constexpr构造函数仍然可以作为常量初始化项:
#include <iostream>
struct A {
int count = 0;
constexpr A() {}
~A() { std::cout << "~A: " << count << std::endl; }
};
A a;
程序可以在任何动态初始化发生之前依赖于a
被初始化,即使A
不是一个文字类类型。
这样做的理由是,尽管A
的析构函数有副作用,但在初始化时不调用它,因此编译器可以在编译时计算a
(实际上是它的.data
)的适当初始内存内容。
请注意,你在第二引号中的重点是不完整的;相关术语是"一个constexpr构造函数用于文字类"。
相关文章:
- constexpr构造函数需要常量成员函数时出现问题
- 在 constexpr 构造函数 (c++17) 中赋值到 const char * 在使用 Android NDK 时
- C++:初始化 constexpr 构造函数中的成员数组
- 编译器生成的默认构造函数具有 constexpr 混淆行为
- 在 constexpr 构造函数中初始化数组是否合法?
- 具有位域的结构的 Constexpr 构造函数
- 编译时生成应在构造函数中创建的非 constexpr 对象数组
- 在构造函数中使用 constexpr 成员
- 类、constexpr 构造函数和 std::string
- 为什么编译器无法弄清楚构造函数实际上是 constexpr?
- 构造函数的Constexpr条件
- 如何在 constexpr 构造函数中初始化矩阵一次?
- 文件中定义的 Constexpr 构造函数.cpp会导致链接错误
- std::可选的默认构造函数不是 gcc 中的 constexpr?
- 对外部模板 constexpr 构造函数的未定义引用
- 为什么默认的构造函数在这里不是 constexpr
- 是否存在与 Eigen::Matrix<>constexpr 构造函数相关的信息?
- constexpr(但不是真正的)构造函数在GCC中编译,而不是在Clang中编译
- 使用constexpr验证构造函数中的文字参数
- C++ 默认构造函数 constexpr 或正确未定义