2017-05-22 2 views
1

qui suit compile bien dans VS2017:Pourquoi un membre non-const, non statique peut-il être accédé à la compilation sans une instance de la classe?

#include <type_traits> 

struct Foo 
{ 
    int bar; 
}; 

int main() 
{ 
    static_assert(std::is_same_v<decltype(Foo::bar), int>, "Foo::bar isn't an int"); 
    return 0; 
} 

Si l'accès des Foo :: bar ne pas appliquer au moment de la compilation que c'est un membre statique de Foo? Je suis tombé sur ceci en essayant de forcer une variable membre spécifique d'un type de modèle à être statique.

Répondre

5

Il n'y a pas accès au membre Foo::bar dans decltype(Foo::bar) spécificateur: il demande simplement le compilateur pour le type de « membre s, une information que le compilateur sait de bar » Foo déclaration de seul.

Ceci est similaire à sizeof expression: vous pouvez faire sizeof(Foo::bar) sans avoir une instance de Foo disponible, et le compilateur produira le résultat correct.