2013-01-23 12 views
15

possiamo fare qualcosa di simile:sizeof (* Questo) a definizione di classe

#include <iostream> 

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

In C standard compaiono i seguenti:

ISO/IEC 9899: 2011

6.7.2.1 Struttura e identificatori di unione

8 ... Il tipo è incompleto fino a subito dopo il termina la lista e completa in seguito.

Ma in C++ Standard non riesco a trovare alcun analogo.

L'operatore sizeof non deve essere applicato a un'espressione che ha un tipo incompleto, quindi possiamo scrivere tale codice o no?

+4

9.2p2 filler filler –

+0

+1 per la ricerca delle specifiche prima di postare. –

risposta

10

Sì, è possibile scrivere tale codice perché il compilatore deve trattarlo come se la definizione della classe fosse completa all'interno delle implementazioni del metodo di classe.

Per esempio si deve trattarlo come se hai scritto:

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

Possiamo scrivere qualcosa del genere? http://liveworkspace.org/code/hN4ty$0 – FrozenHeart

+0

No questo non è permesso. "uso non valido di" questo "al livello più alto" error.it non è all'interno di alcuna funzione membro. "Questo è venuto in esistenza quando la classe viene istanziata . ma in questo codice lo stiamo usando prima della sua esistenza. – Arpit

+0

@Arpit: l'inizializzazione nell'esempio di liveworkspace.org è consentita da C++ 11 a causa di 9.2/2: "All'interno della specifica dei membri della classe, la classe è considerata completa all'interno dei corpi delle funzioni, argomenti predefiniti, specifiche delle eccezioni, e ** inizializzatori brace-or-equal ** per membri di dati non statici "(corsivo aggiunto). –

8

All'interno del corpo funzione membro, la classe è completezza altro, non si poteva accedere a qualsiasi altro funzioni membro, né accedere a qualsiasi variabili membro , che farebbe un membro abbastanza senza valore.

+0

Possiamo scrivere qualcosa di simile? liveworkspace.org/code/hN4ty$0 – FrozenHeart

+0

@NikitaTrophimov no, ma questo comunque funziona: [link] (http://liveworkspace.org/code/pPdNc$0) –

1

Sì, è possibile scrivere e anche il risultato sarà corretto.

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