147 votes

Pourquoi puis-je utiliser de l'auto de sur un type privé?

J'ai été quelque peu surpris de voir que le code suivant compile et exécuter (vc2012 & gcc4.7.2)

class Foo {
    struct Bar { int i; };
public:
    Bar Baz() { return Bar(); }
};

int main() {
    Foo f;
    // Foo::Bar b = f.Baz();  // error
    auto b = f.Baz();         // ok
    std::cout << b.i;
}

Est-il exact que ce code compile bien? Et pourquoi est-il correct? Pourquoi puis-je utiliser auto sur un type privé, alors que je ne peux pas utiliser son nom (comme prévu)?

117voto

R. Martinho Fernandes Points 96873

Les règles d' auto sont, pour la plupart, les mêmes que pour le modèle type de déduction. L'exemple publié de travaux pour la même raison, vous pouvez passer des objets de privé types de modèle de fonctions:

template <typename T>
void fun(T t) {}

int main() {
    Foo f;
    fun(f.Baz());         // ok
}

Et pourquoi pouvons-nous nous passer des objets de privé types de modèle de fonctions, vous demandez-vous? Parce que seul le nom du type est inaccessible. Le type lui-même est encore utilisable, pourquoi vous pouvez le retourner pour le code client.

112voto

chill Points 9384

Le contrôle d'accès est appliqué à des noms. Comparer à cet exemple de la norme:

class A {
  class B { };
public:
  typedef B BB;
};

void f() {
  A::BB x; // OK, typedef name A::BB is public
  A::B y; // access error, A::B is private
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X