10

5.2.8.3: ... If the type of the expression is a class type, the class shall be completely-defined. タイプが「完全に定義されていない」場合、次のプログラムが未定義であることを意味しますか?

foo.cpp:

struct foo
{
  virtual void a(){}
};

struct bar : foo
{
  virtual void a(){}
};

bar abar;

foo& get_some_foo()
{
  return abar;
}

main.cpp:

#include <iostream>
#include <typeinfo>

struct foo;

foo& get_some_foo();

int main()
{
  foo& a_ref_foo(get_some_foo());

  std::cout << "a_ref_foo typeid name: " << typeid(a_ref_foo).name() << std::endl;

  return 0;
}

MSVC10の出力: `a_ref_foo typeid name:struct foo '

4

3 に答える 3

13

私があなたのコードをコンパイルするとき:

g++ foo.cpp main.cpp -o main

私は得る:

main.cpp: In function ‘int main()’:
main.cpp:12:52: error: invalid use of incomplete type ‘struct foo’
main.cpp:4:8: error: forward declaration of ‘struct foo’

typeidこれは、不完全な型には適用できないという私の標準の解釈と一致します。a_ref_foo型の完全な定義がfoo表示されないため、不完全な型です。main.cpp(私が追加した行で)形式が正しくなく、診断が必要です。

アップデート :

Visual Studio2010Expressで問題を再現しました。言語拡張機能が無効になっている場合でも、この簡単なプログラムは次のとおりです。

#include <typeinfo>

struct foo;

int main()
{
  typeid (foo);
  return 0;
}

診断メッセージなしでコンパイルされます。gcc 4.7を使用すると、次のようになります。

main.cpp: In function ‘int main()’:
main.cpp:7:14: error: invalid use of incomplete type ‘struct foo’
main.cpp:3:8: error: forward declaration of ‘struct foo’

同じルール:

式のタイプがクラスタイプの場合、クラスは完全に定義されている必要があります。

ISO C ++標準の1998、2003、および2012バージョンに表示されます。

VisualStudioのバグのようです。(誰かがこれをMicrosoftに報告したい場合は、先に進んでください。)

于 2012-07-04T02:14:04.250 に答える
8

はい、プログラムは(未定義の動作を引き起こすのではなく)不正な形式です。

なぜだろうと思うなら、それは単一の演算子であると考える必要がありますがtypeid、ポリモーフィック型と非ポリモーフィック型のセマンティクスは完全に異なります。特に、fooがポリモーフィック(少なくとも1つの仮想関数がある場合は、実際の型(この場合)のオブジェクトへtypeidの参照を生成しますが、型に仮想関数がない場合は、オブジェクトへの参照を返します)式の静的型(この場合)。type_infobartype_infofoo

コンパイラが適切なコードを生成するには、コンパイラは、使用される場所で2つのケースのどちらが当てはまるかを知る必要があります。typeidタイプが不完全な場合、その情報はコンパイラーに存在しません。

于 2012-07-04T02:59:46.837 に答える
0

関数 get_some_foobarグローバルであるため、プログラムは完全に正しいです。したがって、は完全に定義されていますが、 inbarのバリアントを定義する場合は、それをtypeidのパラメーターとして使用してください。そうしないと、コンパイル時にエラーが発生します。barmain.cpp

于 2012-07-04T00:50:14.203 に答える