¿Cómo invoca esta statement el análisis más molesto?

Considere el siguiente progtwig:

#include  struct A {}; int main(int argc, char** argv) { A a(std::fstream(argv[1])); } 

Clang en modo C ++ 1y reconoce que el MVP se invoca de manera tal que se analiza como una statement de función :

 clang++ -std=c++1y -O3 -Wall -Wextra -pedantic-errors -pthread main.cpp && ./a.out main.cpp:6:8: warning: parentheses were disambiguated as a function declaration [-Wvexing-parse] A a(std::fstream(argv[1])); ^~~~~~~~~~~~~~~~~~~~~~~ main.cpp:6:9: note: add a pair of parentheses to declare a variable A a(std::fstream(argv[1])); ^ ( ) 

Entiendo que el MVP, pero no en este caso: argv[1] es claramente una expresión, y no hay ningún tipo delante de él, así que, ¿cómo podría analizarse esta línea como una statement de función?

¿Es que la interpretación semántica en argv[1] , que desambiguaría la línea como una statement de objeto, no se produce hasta después de que el comstackdor ya ha elegido analizar la línea como una statement de función? ¿O es un error de Clang? ¿O es perfectamente normal a través de alguna interpretación de los tokens argv [ 1 ] que me estoy perdiendo?

Creo que está siendo analizado como

 A a(std::fstream argv[1]); 

es decir, una función que toma una matriz de 1 std::fstream , donde los paréntesis adicionales son redundantes.

Por supuesto, en realidad, ese parámetro de matriz se descompone en un puntero, por lo que lo que terminas con semánticamente es:

 A a(std::fstream* argv); 

Los parens son superfluos. Todas las siguientes son las declaraciones:

 T a; T (a); T ((a)); T (((a)))); 

así son estos:

 T a[1]; T (a[1]); T ((a[1])); T (((a[1])))); 

Asi es esto:

  A a(std::fstream(argv[1])); 

que es lo mismo que

  A a(std::fstream argv[1]); 

que es lo mismo que

  A a(std::fstream *argv); 

Espero que ayude.