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/