36 votes

Visual Studio C++ compilateur comportement bizarre

Je suis juste curieux de savoir pourquoi ce petit morceau de code compile correctement (et sans mises en garde) dans Visual Studio. Peut-être que le résultat est le même avec GCC et Clang, mais malheureusement je ne peux pas tester maintenant.

struct T {
    int t;
    T() : t(0) {}
};

int main() {
    T(i_do_not_exist);
    return 0;
}

43voto

cpplearner Points 1451

T(i_do_not_exist); est une déclaration d'objet avec le même sens que T i_do_not_exist;.

N4567 § 6.8[stmt.ambig]p1

Il y a une ambiguïté dans la grammaire impliquant expression-déclaration de las et de la déclaration,s: Une expression-déclaration d'une fonction de style une conversion de type explicite (5.2.3) comme de gauche sous-expression peut être distingué d'une déclaration où la première demande de déclaration commence avec un (. Dans ces cas, la déclaration est une déclaration.

§ 8.3[dcl.sens]p6

Dans une déclaration à l' T DD a la forme

( D1 )

le type de la demande de déclaration-id est le même que celui de la demande de déclaration-id dans la déclaration

T D1

Les parenthèses ne modifie pas le type de l'option de demande de déclaration-id, mais ils peuvent modifier la liaison du complexe declarators.

17voto

marcin_j Points 12237

Parce qu'il définit une variable de type T:

http://coliru.stacked-crooked.com/a/d420870b1a6490d7

#include <iostream>

struct T {
    int t;
    T() : t(0) {}
};

int main() {
    T(i_do_not_exist);
    i_do_not_exist.t = 120;
    std::cout << i_do_not_exist.t;
    return 0;
}

L'exemple ci-dessus semble idiot, mais cette syntaxe est autorisé pour une raison.

Un meilleur exemple est:

int func1();
namespace A
{
   void func1(int);
   struct X {
       friend int (::func1)();
   };
}

Probablement d'autres exemples pourraient être trouvés.

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