Resolución de sobrecarga y matrices: ¿qué función debería llamarse?
Considere el siguiente programa:
#include <cstddef>
#include <cstdio>
void f(char const*&&) { std::puts("char const*&&"); } // (1)
void f(char const* const&) { std::puts("char const* const&"); } // (2)
template <std::size_t N>
void f(char const (&)[N]) { std::puts("char const(&)[N]"); } // (3)
int main()
{
const char data[] = "a";
f(data);
}
Cualf
debe ser llamado? ¿Por qué
Las últimas versiones lanzadas de tres compiladores no están de acuerdo con la respuesta a esta pregunta:
(1) se llama cuando el programa se compila usando g ++ 4.5.2 (2) se llama cuando el programa se compila usandoVisual C ++ 2010 SP1 (3) se llama cuando el programa se compila usandoClang 3.0 (troncal 127530)¿Han cambiado sustancialmente las reglas de resolución de sobrecarga en diferentes borradores de C ++ 0x? ¿O dos de estos compiladores están realmente completamente equivocados? ¿Qué sobrecarga es la sobrecarga correcta que se seleccionará según el último borrador de C ++ 0x?