15

次のようなことができますか?

#include <iostream>

class Foo
{
public:
   Foo() { std::cout << sizeof(*this) << '\n'; }
};

C標準では、次のように表示されます。

ISO/IEC 9899:2011

6.7.2.1 構造体および共用体指定子

8 ... リストを終了する } の直後まで型は不完全であり、その後は完全です。

しかし、C++ 標準では、類似物が見つかりません。

sizeof 演算子は、不完全な型を持つ式には適用されないので、そのようなコードを記述できるかどうか?

4

3 に答える 3

10

はい、そのようなコードを記述できます。コンパイラは、クラス定義がクラス メソッドの実装内で完全であるかのように処理する必要があるためです。

たとえば、あなたが書いたかのように扱う必要があります:

#include <iostream>

class Foo
{
public:
   Foo();
};

// Methods declared in the body of a class are implicitly inline
// Inline, however, probably doesn't mean what you think it means:
inline Foo::Foo() { std::cout << sizeof(*this) << '\n'; }
于 2013-01-23T18:08:01.460 に答える
8

メンバー関数本体の内部では、クラスは完全です。それ以外の場合、他のメンバー関数にアクセスすることも、メンバー変数にアクセスすることもできず、かなり価値のないメンバーになります。

于 2013-01-23T18:08:06.003 に答える
1

はい、書くことができ、結果も正しいでしょう。

#include<iostream>
using namespace std;
class Foo
{
public:
       int x;
   Foo() { std::cout << sizeof(*this) << '\n'; }
};
int main(){
    Foo b;
    b.x=5;
    system("pause");
    return 0;
    }
于 2013-01-23T18:13:57.273 に答える