struct A
{
A(const A& src);
A(const char* src);
};
struct B
{
operator A();
operator char*();
};
void test()
{
B v;
A s(v);
}
EDG/Comeau y MSVC permite el código, mientras que GCC 4.4.4, CLANG y BCC lo rechazan como ambiguo.¿Debería ser ambiguo o no? (modelos implícitos)
miembro del comitéA C++ respondió con este (inicialmente):
No es ambigua; el constructor A (const A &) es mejor que el constructor A (const char *). El const Un parámetro & se une directamente al resultado de la función de conversión, por lo que la secuencia de conversión se considera ser una conversión definida por el usuario siguió por una conversión identidad (13.3.3.1.4p1). El parámetro const char * es una conversión definida por el usuario seguida de una conversión de calificación , por lo que es peor.
Luego, siguió con esto.
En realidad, estaba equivocado. Si bien es cierto que la segunda secuencia de conversión en una secuencia de conversión definida por el usuario es un desempate, mirando más de cerca a 13.3.3.2p3, la siguiente a la última bala, revela que esta desempate sólo se aplica si las dos secuencias contienen la misma secuencia de conversión definida por el usuario y que no es el caso en este ejemplo. Debido secuencia conversión de un constructor utiliza B :: operador A() y el carbón otros usos b :: operador *(), no hay desempate entre los dos secuencias de conversión definidas por el usuario y son ambiguas.
Mi pregunta es esta.
13.3.3.2 p3 establece que,
Dos secuencias de conversión implícitas de la misma forma son secuencias conversión indistinguibles a menos que uno de los siguientes reglas se aplican.
Según mi entender, las palabras clave son "una de las siguientes reglas". No significa que la viñeta que indica "misma secuencia de conversión" anula todas las anteriores. Hubiera pensado que "el rango de S1 es mejor que el rango de S2" sería aplicable en su lugar?
Buena prueba de que C++ tiene un poco demasiado complicado ... – Hexagon
Dado que tiene un contacto de miembro de la comunidad de C++, ¿no debería simplemente pedirle que presente un problema? (o verifique si está archivado en http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html) –
No dije que hay un problema, en realidad estoy tratando de entender el estándares. –