n3527建议将std::optional<T>添加到c++。作为它的一部分,它定义了nullopt_t类型标记。

gcc(4.9)libstdc++定义optional_t如下:

struct nullopt_t
{
    enum class _Construct { _Token };
    explicit constexpr nullopt_t(_Construct) { }
};
constexpr nullopt_t nullopt { nullopt_t::_Construct::_Token };

clang(3.6)的libc++将其定义为:
struct nullopt_t
{
    explicit constexpr nullopt_t(int) noexcept {}
};
constexpr nullopt_t nullopt{0};

我的问题是:为什么这样做(看起来)过于复杂?

换句话说,为什么不能定义如下:
struct nullopt_t { };
constexpr nullopt_t nullopt { };

例如,这就是在标准库中定义std::defer_lock_t和其他代码的方式。

最佳答案

在这里回答自己,但值得赞扬的是kakkoko,使我处在正确的轨道上。

相关问题链接到较新的修订版n3793,该版本详细介绍了The op = {} syntax段落中nullopt_t的额外复杂性。

简而言之,以避免将nullopt_t语法含糊不清的方式,将DefaultConstructible声明为非op = {}。您可以阅读前面链接的段落以获取更多详细信息。

关于c++ - c++ optional_t类型标签(n3527),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36393727/

10-12 00:52