gpt4 book ai didi

c++ - std::unique_ptr constexpr 构造函数

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

如图here , std::unique_ptr 有两个用于空指针的 constexpr 构造函数:

constexpr unique_ptr();
constexpr unique_ptr( nullptr_t );

我对这两个构造函数有两个问题:

  1. 为什么我们需要两个?我们不能只声明一个:

    constexpr unique_ptr( nullptr_t = nullptr );
  2. constexpr 真的有用吗?我尝试在我的代码中这样做,但它没有编译(g++ 6.1.0,-std=c++14):

    constexpr std::unique_ptr<int> p;
    // error: the type 'const std::unique_ptr<int>' of constexpr variable 'p'
    // is not literal because 'std::unique_ptr<int>' has a non-trivial destructor

最佳答案

对于(1),考虑它确保无参数构造函数 unique_ptr() 和空指针构造函数 unique_ptr(nullptr_t) 具有相同的编译-时间保证,即两者都是 constexpr。我们可以在 §20.8.1.2 中看到不同之处:

constexpr unique_ptr() noexcept;
explicit unique_ptr(pointer p) noexcept;
...
constexpr unique_ptr(nullptr_t) noexcept
: unique_ptr() { }

为什么这两者没有组合成一个带有默认值的构造函数,这很可能是历史偶然性。

关于 (2),为什么我们应该关心 constexpr 尽管有一个非平凡的析构函数,请考虑 the answer given here :

constexpr constructors can be used for constant initialization, which, as a form of static initialization, is guaranteed to happen before any dynamic initialization takes place.

For example, given a global std::mutex:

std::mutex mutex;

In a conforming implementation (read: not MSVC), constructors of other objects can safely lock and unlock mutex, becuase std::mutex's constructor is constexpr.

关于c++ - std::unique_ptr constexpr 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38538855/

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