C++17 make_optional constexpr-ness

C++17 make_optional constexpr-ness

本文关键字:constexpr-ness optional make C++17      更新时间:2023-10-16

此页面说C 17中的make_optional功能返回constexpr optional<...>。我认为(虽然我可能错了)这将要求optional<T>具有constexpr复制或移动构造函数。但是,此页面也说事实并非如此。

我不知道如何实现make_optional,因为当前C 1Z草稿。请参阅此帖子以进行澄清。是否有解决方法,或者这只是标准草稿/CPPReference的错误?

感谢@yakk和 @t.c。为了解释。我觉得一个例子应该使事情变得更清晰:

struct wrapper {
    int value;
    // non-explicit constexpr constructor
    constexpr wrapper(int v) noexcept : value(v) {}
    // non-constexpr copy & move constructors
    wrapper(const wrapper& that) noexcept : value(that.value) {}
    wrapper(wrapper&& that) noexcept : value(that.value) {}
};
constexpr wrapper make_wrapper(int v)
{
    return {v};
}
int main()
{
    constexpr auto x = make_wrapper(123);  // error! copy/move construction,
                                           // but no constexpr copy/move ctor
    constexpr int y = make_wrapper(123).value;  // ok
    static_assert(y == 123, "");                // passed
}

因此make_wrapper确实成功返回了constexpr wrapper;由于没有constexpr复制/移动构造函数,因此是防止代码编译的副本/移动构造(虽然通常由编译器所阐明)。

我们可以通过使用其成员值来初始化constexpr变量来验证返回(临时)wrapper对象的constexpr-性。

您可以在return {something};中直接在C 11中构建返回值,如果有任何非宣传ctors constexpr,您可以从函数中返回它。