c++;可选类型标签(n3527) 建议将 STD::可选< /COD>添加到C++。作为它的一部分,它定义了nullopt\ttype标记
gcc的(4.9)libstdc++定义了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
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
的定义相互依赖。