Nehmen wir folgendes Beispiel:Ambiguität zwischen const am besten passende Funktion und andere Funktion
#include <type_traits>
#if 1
struct X {};
struct O
{
O(X) { ; }
};
#else
struct O {};
struct X
{
operator O() { return {}; }
};
#endif
static_assert(std::is_convertible< X, O >::value);
struct S
{
void f(X) const { ; }
void f(O) { ; }
};
#include <cstdlib>
int
main()
{
S s;
s.f(X{});
return EXIT_SUCCESS;
}
Es gibt einen Fehler:
error: call to member function 'f' is ambiguous
Wenn ich const
-qualifier entfernen, dann der Fehler hört auf zu existieren. Genauso ist es auch, wenn ich der zweiten Überladung von f
const
-qualifier hinzufüge. I.e. Wenn beide Überladungen gleichermaßen const
-Qualifiziert sind, dann ist alles in Ordnung.
Warum ist es so?
Mein Compiler ist clang 3,8.
'std :: declval
() .f (O (x))' 'vs std :: declval() .f (x)' (für 'std :: declval () .f (x) '). benutzerdefinierte Conversions im Vergleich zur Const-Promotion. – Jarod42@ Jarod42 bedeutet es, dass während der Auflösung die Stärke beider Alternativen gleich ist? – Orient
@Orient Das ist die Definition von Ambiguität. – erip