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
dondeD
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.