std::endl
es una plantilla de función. Normalmente, se usa como argumento para el operador de inserción <<
. En ese caso, el operator<<
de la transmisión en cuestión se definirá como p. ostream& operator<< ( ostream& (*f)(ostream&))
. Se define el tipo de argumento de f
, por lo que el compilador conocerá la sobrecarga exacta de la función.
Es comparable a esto:
void f(int){}
void f(double) {}
void g(int) {}
template<typename T> void ft(T){}
int main(){
f; // ambiguous
g; // unambiguous
ft; // function template of unknown type...
}
Pero se puede resolver la ambigüedad de algunos consejos de tipo:
void takes_f_int(void (*f)(int)){}
takes_f_int(f); // will resolve to f(int) because of `takes_f_int` signature
(void (*)(int)) f; // selects the right f explicitly
(void (*)(int)) ft; // selects the right ft explicitly
Eso es lo que sucede normalmente con std::endl
cuando se suministra como un argumento a operator <<
: existe una definición de la función
typedef (ostream& (*f)(ostream&) ostream_function;
ostream& operator<<(ostream&, ostream_function)
Y esto permitirá que el compilador elija la sobrecarga correcta de std::endl
cuando se suministre a, p. std::cout << std::endl;
.
¡Buena pregunta!
Cuál de línea de corriente tendría que terminar? – dreamlax