2011-09-09 41 views
1

C++ 03標準によると、不完全な型への参照は有効ですか?私は、null以外のポインタ以外のものとして参照を実装する実装は認識していないので、そのようなコードは動作するはずです。しかし、不完全な型への参照が標準に準拠しているかどうかは疑問です。不完全な型への参照

私は、引用符とC++標準への参照との回答に感謝します。

答えて

4

C++標準では、わかっている限り、不完全な型への参照を明示的に指定することはできません。

3.2 1つの定義ルールAの[basic.def.odr]

4.正確に一つの定義:しかし、標準タイプ完了していなければならない時に指定するセクションを持っていますクラスタイプが であることが必要な方法でクラスが使用されている場合は、翻訳の ユニットでクラスが必要です。 [例:

struct X;  // declare X as a struct type 
    struct X* x1; // use X in pointer formation 
    X* x2;  // use X in pointer formation 

末端例は、以下の完全な変換ユニットは、それがXを定義することがないにもかかわらず、 よく形成されている] [注:宣言および表現のルール で記述どのコンテキストが完全なクラス型であるかが必要です。クラス タイプTである必要があり、完全な場合:

  • タイプTの目的は、左辺値対右辺値変換は を参照左辺値に適用される(3.1、5.3.4)、または
  • 定義されていますタイプTのオブジェクト(4.1)、又は
  • 発現は タイプT(条項4、5.2.3、5.2.7、5.2.9、5.4)、又は
  • に(暗黙的または明示的に)変換されます。ヌルポインタ定数ではなく、型を持つ式void *以外 は、暗黙的な変換(項4)、dynamic_cast(5.2.7) 又はstatic_cast(5.2.9)、または
  • クラスのメンバーを使用してTTまたは参照 に型ポインタに変換されます。アクセス演算子は、タイプ Tの式に適用されます(5.2。5)、又は
  • typeidオペレータ(5.2.8)またはsizeofオペレータ(5.3.3)タイプTのオペランドに適用 、又は
  • タイプTの戻り型や引数型を持つ関数です。 (3.1)または呼び出された(5.2.2)、または
  • Tの値が(5.17)に割り当てられています。 ]

不完全型への参照の宣言を含む他のすべての場合で、タイプが不完全になることができるように思われます。

+1

このリストは、非常に便利ですが、非規範的なメモにあり、したがって何も指定していないことに注意してください。それはただ役に立ちます。 –

4

は§15.1.3、スロー式の

型が不完全型、またはvoid *以外の不完全な型へ ポインタや参照、constの のvoid *であってはならないと言いますvolatile void *、ま​​たはconst volatile void *を返します。

これは、不完全なタイプへの参照を持つことができると思われるようです。

私はまだ標準を解釈するのにはあまりよくありませんので、その方法を取ってください。

関連する問題