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]));
}
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.