Rozważmy następujący przykład:Wieloznaczność między funkcją const najlepiej pasującej i innych funkcji
#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;
}
To daje błąd:
error: call to member function 'f' is ambiguous
Kiedy usuwanie const
-qualifier, a następnie błąd przestaje istnieć. Podobnie dzieje się tak samo, jeśli dodaję kwalifikator const
do drugiego przeciążenia f
. To znaczy. jeśli oba przeciążenia są równe const
- zakwalifikowane, to wszystko jest w porządku.
Dlaczego tak jest?
Mój kompilator to clang 3.8.
'std :: declval
() .f (O (x))' vs 'std :: declval() .f (x)' (dla 'std :: declval () .f (x) '). konwersja zdefiniowana przez użytkownika w porównaniu do promocji stałej. – Jarod42@ Jarod42 oznacza to, że podczas rozwiązywania moc obydwu alternatyw jest taka sama? – Orient
@Orient To jest definicja niejednoznaczności. – erip