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