8

type のオブジェクトを値初期化するTには、次のいずれかの行に沿って何かを行います。

T x = T();
T x((T()));

私の質問は、単純な型指定子の組み合わせによって指定される型に関するものですunsigned int

unsigned int x = unsigned int();
unsigned int x((unsigned int()));

Visual C++ 2008 およびインテル C++ コンパイラー 11.1 は、これらの両方を警告なしで受け入れます。Comeau 4.3.10.1b2 と g++ 3.4.5 (確かに、特に最近ではありません) にはありません。

C++ 標準 (C++03 5.2.3/2、expr.type.conv) によると:

式はT()T非配列完全オブジェクト型または (おそらく cv 修飾された)void型の単純型指定子 (7.1.5.2) であり、指定された型の右辺値を作成します。これは値で初期化されます。

unsigned7.1.5.2 は、「単純な型指定子は次のとおりです」と述べ、とを含むリストが続きますint

したがって、5.2.3/2 では「simple-type-specifier」が単数でありunsignedint2 つの型指定子であることを考えると、上記の使用例はunsigned int無効ですか? (もしそうなら、フォローアップは、Microsoft と Intel が上記の表現をサポートするのは間違っていますか?)

この質問は、何よりも好奇心からのものです。複数の単純な型指定子の組み合わせによって指定されたすべての型について、値の初期化はゼロの初期化と同等です。(この質問は、この初期化に関する質問への回答に対するコメントによって促されました)。

4

4 に答える 4

8

この質問をcomp.lang.c++。moderatedに投稿しました。

C ++標準委員会のDanielKrüglerは、単純な型指定子unsigned int組み合わせであり、それ自体が単純な型指定子ではないという解釈に同意しました。

Jerry Coffinが参照している表7のキャプションに関して、Krüglerは次のように述べています。

表7のヘッダー(最新のドラフトN3000では表9)がやや誤解を招く可能性があることに同意しますが、[dcl.type.simple] / 2の前のテキストは、次のようになっていると非常に明確に見えます。

表7は、simple-type-specifiersとそれらが指定するタイプの有効な組み合わせをまとめたものです。」

(ニュースグループからここにこれを投稿するのに非常に時間がかかったことをお詫びします;それは完全に私の心を滑らせました)

于 2010-03-12T18:45:20.070 に答える
1

§7.1.5.2では、表7まで読み続けてください。この表には、単純な指定子として許可されているものの完全なリストがあります(これには、「unsignedint」が含まれます)。

于 2010-01-27T03:06:21.637 に答える
1

うーん、typedef が必要な場合があります。診断が必要であると書かれていない場合、これをサポートすることは間違いではありません。それにもかかわらず、移植性のために、typedef (uint16_tまたはuint64_t、それらは正しくないかもしれませんが) を使用するか、型名をテンプレートで引用することができます:

iterator<void, unsigned long>::value_type( 5 )

不当に冗長なのはどうですか?

編集:当然、または単に5ul. unsigned shortunsigned char、およびはsigned char、簡単に明示的に構築できない唯一の型です。

于 2010-01-27T03:01:39.933 に答える
-2

7.1.5.2:

simple-type-specifiers は、以前に宣言されたユーザー定義型または基本型のいずれかを指定します`

unsigned int i = unsigned int()は基本型であるため、これは正当であることを意味しますunsigned int(したがって、simple-type-specifierです。3.9.1 を参照してください)。

次のようなタイプにも同じことが当てはまります。

long double
long long
long long int
unsigned long
unsigned long long int
short int
...
于 2010-01-27T10:08:19.063 に答える