c++ c++03 most-vexing-parse

c++ - El análisis más desconcertante con acceso a la matriz



c++03 most-vexing-parse (2)

Creo que esto se desprende del principio de "sintaxis de declaración es como sintaxis de expresión", y el hecho de que los parámetros de "matriz" son punteros.

Las siguientes declaraciones de matriz son equivalentes:

int x[1]; int (x)[1]; int (x[1]);

más o menos porque x[a] , (x)[a] y (x[a]) son expresiones equivalentes.

Así,

std::stringstream ss(std::string(argv[0])) <=> std::stringstream ss(std::string argv[0]) <=> std::stringstream ss(std::string* argv)

Mientras miraba un código de C ++ 03, encontré una instancia del análisis más desconcertante que me confundió:

#include <sstream> #include <string> int main(int, char** argv) { std::stringstream ss(std::string(argv[0])); }

ejemplo vivo en wandbox

En el fragmento de código anterior, ss es una declaración de una función que toma un std::string* y devuelve std::stringstream .

¿Cómo se analiza std::string(argv[0]) como std::string* ?

Intuitivamente pensé que argv[0] era un acceso inequívoco a argv .


La razón es porque en el contexto de una declaración de función, el compilador interpretará std::string(argv[0]) como std::string argv[0] , es decir, una declaración de una matriz de tamaño cero como el parámetro de función denominado argv (opacando el argv de main , ya que este es un alcance diferente), que entonces es equivalente a un puntero por matriz-a-puntero-decaimiento .

Por lo tanto, std::stringstream ss(std::string(argv[0])); significa lo mismo que std::stringstream ss(std::string* argv);

Edición: Como se anotó correctamente en los comentarios, las declaraciones de matriz de tamaño cero no son válidas en C ++, lo que hace que el programa no esté bien formado. Al compilar este código con indicadores -pedantic (GCC y clang), se emitirán advertencias. Visual Studio incluso produce un error de compilación. Para cualquier otro índice de matriz que no sea 0, la argumentación anterior, sin embargo, sigue siendo válida.