Sizeof (* this) в определении класса

Можем ли мы сделать что-то вроде этого:

#include <iostream>

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

В стандарте C я вижу следующее:

ISO/IEC 9899: 2011

6.7.2.1 Спецификации структуры и объединения

8... Тип является неполным, пока сразу после {} завершает список и завершается после этого.

Но в С++ Standard я не могу найти аналог.

Оператор sizeof не применяется к выражению с неполным типом, поэтому мы можем написать такой код или нет?

Ответы

Ответ 1

Да, вы можете написать такой код, потому что компилятор должен обработать его, как будто определение класса завершено внутри реализации метода класса.

Например, он должен обрабатывать его так, как если бы вы написали:

#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'; }

Ответ 2

Внутри тела функции-члена класс является полным, иначе вы не сможете получить доступ к каким-либо другим функциям-членам и не обращаться к переменным-членам, что сделало бы довольно бесполезным членом.

Ответ 3

Да, вы можете написать, а также результат будет правильным.

#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;
    }