visual studio instalar c++ visual-studio-2012 most-vexing-parse

instalar - Comportamiento extraño del compilador de Visual Studio C++



msdn c++ (2)

Porque define una variable de tipo 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; }

El ejemplo anterior parece tonto, pero esta sintaxis está permitida por una razón.

Un mejor ejemplo es:

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

Probablemente se puedan encontrar otros ejemplos.

Solo tengo curiosidad por saber por qué este pequeño fragmento de código se compila correctamente (y sin advertencias) en Visual Studio . Quizás el resultado sea el mismo con GCC y Clang , pero desafortunadamente no puedo probarlos ahora.

struct T { int t; T() : t(0) {} }; int main() { T(i_do_not_exist); return 0; }


T(i_do_not_exist); es una declaración de objeto con el mismo significado que T i_do_not_exist; .

N4567 § 6.8 [stmt.ambig] p1

Hay una ambigüedad en la gramática que implica declaraciones de expresión y declaración s: Una expresión-declaración con una conversión de tipo explícita de tipo de función (5.2.3) como su subexpresión más a la izquierda puede ser indistinguible de una declaración donde el primer declarador comienza con una ( . En esos casos, la declaración es una declaración .

§ 8.3 [dcl.meaning] p6

En una declaración TD donde D tiene la forma

( D1 )

el tipo del ID del declarante contenido es el mismo que el del ID del declarante contenido en la declaración

T D1

Los paréntesis no modifican el tipo de id del declarador incrustado, pero pueden alterar el enlace de los declaradores complejos.