11

標準では、これは型(2.14.7)nullptrのポインター リテラルであると述べています。std::nullptr_tそして 18.2p9nullptr_t

namespace std {
  typedef decltype(nullptr) nullptr_t;
}

7.1.6.2では、p4decltype(nullptr)は式の型でありnullptr、これは定義によるものですstd::nullptr_t(式nullptrは prvalue であるため)。nullptr_tそれを結果の定義に代入すると、

typedef nullptr_t nullptr_t

一方、typedef 指定子は新しい型を導入するのではなく、別の既存の型の名前にすぎません。それで、正確には何nullptr_tですか?私はこれらの定義を理解することができません。

4

2 に答える 2

10

これは実装固有です。重要なのは次のことです (p. 18.2/9 of the C++11 Standard):

[...]nullptr_tがシノニムである型は、3.9.1 および 4.10 で説明されている特性を持っています。[...]

これらの 2 つの段落で規格が指定するように動作する限り、それは何でもかまいません。

あなたの議論の論理的な誤謬は、次のようなものだと思います。

7.1.6.2 により、p4decltype(nullptr)は式の型でありnullptr、これは定義によるものですstd::nullptr_t(式nullptrは prvalue であるため)

型エイリアスではないという意味ではありません。たとえば、次のように定義します。nullptr_t

typedef decltype(42) foo;

式のタイプは次のように言えます。

42

ですfoo。ただし、foo別の型 ( ) のエイリアスにすぎませintん。

于 2013-06-12T15:30:13.577 に答える
4

内部的にはヌルポインタ定数型のエンティティがあります。基本型の一つです。

キーワード、リテラル、および式nullptrは、この型を持ちます。 decltype(nullptr)このタイプを指します。

ただし、名前 std::nullptr_tはキーワードではない (文脈依存のキーワードでさえない) ため、名前は宣言されるまで存在しません。名前を宣言せずに参照すると、std::nullptr_t宣言されていない名前と同様にエラーになります。

そのため、は他の基本型と同様に変換の開始時に存在しますが、名前は存在しません。

実際、short int など、「単一のスペル」を持たない他の基本的な型があります。short int は、 、 、 、 、またはその順列としてshort参照short intできsigned short intますsigned short

typeidまた、演算子 (キーワード) と式の型のtypeid(...)関係と似ていませんstd::typeinfotypeinfoもキーワードではなく、名前は宣言される前には存在しません。

基本的に、エンティティ(null ポインター定数型) を名前( std::nullptr_t)と混同しています。

nullptr_t言語の設計者がandをキーワードとして指定しなかった理由を尋ねるtypeinfoと、同じ綴りのユーザー定義の名前と名前が衝突する危険を冒すほど一般的ではないのではないかと推測します。このような衝突は、あらゆるスコープで発生することを思い出してください。

于 2013-06-12T16:06:11.040 に答える