14

この C++11 プログラムは不正ですか?

typedef void& rv;

int main() {}

標準でそれを禁止するものは見つかりませんでした (3.9.2 と 8.3.2 を参照)。

Clang は「'void' への参照を形成できません」と言い、gcc は「'void' への参照を宣言できません」と言う

[dcl.ref]/5 がそのような制限を与えることを意図していたなら、私はそれを期待していたでしょう。

そのような型はオブジェクト定義では決して使用できないため、実装は単に「行間を読む」だけですか?

4

2 に答える 2

16

C ++ 11標準からの引用(強調鉱山):

8.3.2 参考文献

1 [...] 「<strong>cv voidへの参照」型を指定する宣言子の形式が正しくありませ


補足情報として、このルールはN3421greater<>提案(将来の C++14 標準に含まれることが既に承認されている) によってvoid、デフォルトのテンプレート引数として使用されています。

B. デフォルトのテンプレート引数と明示的な特殊化を使用する手法はvoid、非侵入性のために選択されました。は有効な C++11 ではありません ( 8.3.2 [dcl.ref]/1 で禁止されてgreater<void> いる への参照を形成しようとします)。voidさらに、ユーザーは標準ライブラリ機構 (17.6.4.2.1 [namespace.std]/1) を特殊化することが許可されていますが、そのような特殊化にはユーザー定義型が含まれている必要があります。


多分私はこれらのマインドゲームにもう少し夢中になっているだけかもしれませんが、なぜこのルールが適用されるかの根拠として、これは私自身の謙虚な意見であることを述べなければなりません-次のコードを検討してください:

sizeof(double&);   // Results in double's size

using foo_ref = foo&;
sizeof(foo_ref);   // Results in foo's size

sizeof(void);      // Error! void has no size!
sizeof(void&);     // Error! Tries to get the size of void

最も重要なことは、参照は他のオブジェクトの単なるエイリアスであり、 type のオブジェクトを持つことはできないことに注意してくださいvoid

于 2013-10-09T02:35:34.357 に答える
2

a への参照voidは、型を持たないデータが指すことを意味するため、意味のある方法で参照することはできません。

参照は、 type にすることのできない、ある型のインスタンスへの参照ですvoid

于 2013-10-09T02:41:28.673 に答える