2016-04-04 4 views
1

n3527は、C++にstd::optional<T>を追加することを提案しています。その一部として、タイプタグnullopt_tを定義します。C++ optional_t型タグ(n3527)

GCCの(4.9)は次のようoptional_tを定義のlibstdC++:私の質問がある

struct nullopt_t 
{ 
    explicit constexpr nullopt_t(int) noexcept {} 
}; 
constexpr nullopt_t nullopt{0}; 

:なぜそれがそのように行われている、であるとしてのlibC++

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

打ち鳴らすの(3.6)は、それを定義します(見た目に)複雑すぎる?言い換えれば

、次のようになぜそれが定義することはできません。

struct nullopt_t { }; 
constexpr nullopt_t nullopt { }; 

これは、例えば、std::defer_lock_t等が標準ライブラリで定義されているか、です。

+2

これは、独自の 'nullopt_t'を構築する正当な方法がないことを意味しますか? 'nullptr_t'のような並べ替え? – Yakk

+3

はおそらく関連:[実験::オプションnullopt_tコンストラクタ](http://stackoverflow.com/questions/28332078/) – kakkoko

+0

@kakkoko、あなたは右のトラックに私を置きます! 'op = {}'構文と関係があります。それは基本的に、あいまいさを避けるために 'nullopt_t'を非'DefaultConstructible'にします。 –

答えて

1

ここに自分自身を答えるが、クレジットは、右のトラックに私を置くためkakkokoに進みます。

関連する質問は、の余分な複雑さを解説したn3793のにリンクしています。The op = {} syntax段落にあります。

一言で言えば、構文のあいまいさを避けるために、nullopt_tは、それを非DefaultConstructibleにするように宣言されています。詳細については、前述の段落を読むことができます。