x64 - visual c++ 2017




Comportement bizarre du compilateur Visual Studio C++ (2)

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 stupide, mais cette syntaxe est autorisée 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.

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

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

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

T(i_do_not_exist); est une déclaration d'objet ayant la même signification que T i_do_not_exist; .

N4567 § 6.8 [stmt.ambig] p1

Il existe une ambiguïté dans la grammaire impliquant expression-déclaration s et déclaration s: Une expression-expression avec une conversion de type explicite de type fonction (5.2.3) car sa sous-expression la plus à gauche peut être distinguée d'une déclaration où le premier déclarant commence par ( Dans ces cas, la déclaration est une déclaration .

§ 8.3 [dcl.meaning] p6

Dans une déclaration TDD a la forme

( D1 )

le type de l' identificateur-déclarateur contenu est le même que celui de l' identificateur-déclarateur contenu dans la déclaration

T D1

Les parenthèses ne modifient pas le type de l' identificateur de déclarateur incorporé, mais elles peuvent modifier la liaison des déclarants complexes.





most-vexing-parse