
templatetypedef
Mi pregunta es cómo se puede analizar la siguiente línea como una declaración de función:
vector<int> v(istream_iterator<int>(cin), istream_iterator<int>());
Entiendo la mayoría de los detalles de Most Vexing Parse y por qué el segundo iterador temporal puede interpretarse como un tipo que es una función que devuelve un iterador y no toma argumentos, pero lo que no entiendo es por qué el primer iterador temporal puede ser interpretado como un tipo. ¿Qué tipo representa? Mi idea es que sería algún tipo de función, pero no puedo ver cómo el nombre cin
se acostumbra ¿Está declarando que el parámetro es un istream_iterator<int>
llamado cin
? Si es así, ¿eso significa que puede poner entre paréntesis arbitrariamente los nombres de los argumentos de las funciones? Y si es así, ¿por qué?
¿Ya dije que me gustaba Clang (mucho)?
Simplemente intente lo siguiente (código simplificado)
#include <vector>
void foo(std::vector<int>);
int main() {
std::vector<int> v(int(i), int());
foo(v);
}
En el recién renovado Prueba LLVM (bueno, simplemente pasó de llvm-gcc a clang).
Y obtienes:
/tmp/webcompile/_21483_0.cc:6:21: warning: parentheses were disambiguated
as a function declarator
std::vector<int> v(int(i), int());
^~~~~~~~~~~~~~~
/tmp/webcompile/_21483_0.cc:7:3: error: no matching function for call to 'foo'
foo(v);
^~~
/tmp/webcompile/_21483_0.cc:3:6: note: candidate function not viable:
no known conversion from 'std::vector<int> (int, int (*)())'
to 'std::vector<int>' for 1st argument
void foo(std::vector<int>);
^
3 diagnostics generated.
Y por lo tanto, @john tiene razón, int(i)
se interpreta como int i
es decir, un parámetro con nombre para la función.
Sí, es el nombre del parámetro. Y sí, puede agregar un conjunto de paréntesis, porque a veces es necesario.
Si el parámetro es un puntero de función, void (*f)()
tienes que escribirlo así.
Las personas que escriben el estándar no han dedicado su valioso tiempo a señalar exactamente los casos en los que los paréntesis están permitidos o en los que realmente se requieren, por lo que el estándar simplemente dice que usted puede tenerlos.