gpt4 book ai didi

c++ - 为什么要为具有非平凡析构函数的类声明 constrexpr 构造函数(例如 unique_ptr、std::variant)

转载 作者:IT老高 更新时间:2023-10-28 22:14:05 28 4
gpt4 key购买 nike

据我了解(至少对于 c++14 而言),析构函数不能是 constexpr如果它不是微不足道的(隐式生成或 =default )。声明 constexpr 有什么意义?具有非平凡析构函数的结构的构造函数?

struct X {
int a_;

constexpr X(int a) : a_{a} {}

// constexpr ~X(){}; // Error dtor cannot be marked constexpr
// ~X(){}; // causes error at y declaration: temporary of non-literal type ‘X’
// in a constant expression .
};

template <int N> struct Y {};

int main() {
Y<X{3}.a_> y; // OK only if the destructor is trivial
(void)y;
}
// tested with c++14 g++-5.1.0 and clang++ 3.5.0

例如 std::unique_ptr有一些constructors constexpr (默认和 nullptr_t ),即使析构函数显然是明确定义的(如果对象是 nullptr ,请确保它没有效果,但这并不意味着它仍然具有明确定义的析构函数以检查是否对象处于空状态,正如我所见,即使是空析构函数也不允许在编译常量表达式中使用对象)

另一个例子是 std::variant 的提案。 : 它几乎有所有的构造函数constexpr尽管析构函数具有签名 ~variant()它必须 call get<T_j> *this).T_j::~T_j() with j being index().

我错过了什么?

最佳答案

constexpr 构造函数可用于常量初始化,作为静态初始化的一种形式,它保证在任何动态初始化发生之前发生。

例如,给定一个全局 std::mutex:

std::mutex mutex;

在符合标准的实现中(阅读:不是 MSVC),其他对象的构造函数可以安全地锁定和解锁 mutex,因为 std::mutex 的构造函数是 constexpr.

关于c++ - 为什么要为具有非平凡析构函数的类声明 constrexpr 构造函数(例如 unique_ptr、std::variant),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30766103/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com