c++;可选类型标签(n3527) 建议将 STD::可选< /COD>添加到C++。作为它的一部分,它定义了nullopt\ttype标记

c++;可选类型标签(n3527) 建议将 STD::可选< /COD>添加到C++。作为它的一部分,它定义了nullopt\ttype标记,c++,c++11,c++17,C++,C++11,C++17,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 }; struct nullopt_t { }; constexpr nullopt

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 };
struct nullopt_t { };
constexpr nullopt_t nullopt { };
clang的(3.6)libc++将其定义为:

struct nullopt_t
{
    explicit constexpr nullopt_t(int) noexcept {}
};
constexpr nullopt_t nullopt{0};
我的问题是:为什么这样做,(似乎)过于复杂

换句话说,为什么不能定义为:

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

例如,
std::defer_lock_t
和其他函数在标准库中就是这样定义的。

在这里回答我自己,但要归功于Kakko让我走上了正确的道路

相关问题链接到一个更新的版本,该版本阐述了段落中
nullopt\t
的额外复杂性


简而言之,
nullopt_t
以这种方式声明,以使其不可
DefaultConstructible
,从而避免
op={}
语法的歧义。您可以阅读前面链接的段落以了解更多详细信息。

这意味着没有合法的方法来构建您自己的
nullopt\t
?有点像
nullptr\u t
?可能相关:@kakko,你让我走上了正确的轨道!它与
op={}
语法有关。它基本上使
nullopt\u t
不可构造为默认值为了避免歧义
nullopt\u t
只能用
nullopt
表达式构造。理想情况下,对于
nullopt
,此唯一构造函数必须是私有的,具有
friend
访问权限,但是
nullopt\t
nullopt
的定义相互依赖。