Aufruf der mit ref-Qualifiers überladenen Member-Funktion ist mehrdeutig
Beim Kompilieren meines Codes mit habe ich ein seltsames Verhalten festgestelltG ++ (gcc 4.8.1 undMinGW 4.8.2 mit-std=gnu++1y
Flagge). Im Geiste der SSCCE isoliere ich das folgende Snippet:
struct C
{
template< typename X >
auto
f(X &&) const &
{ ; }
template< typename X >
auto
f(X &&) &
{ ; }
template< typename X >
auto
f(X &&) &&
{ ; }
};
int main()
{
int i{};
#if 1
C{}.f(i);
#endif
#if 1
C c{};
c.f(i);
#endif
return 0;
}
Es gibt einen Fehler:
main.cpp: In function 'int main()':
main.cpp:29:10: error: call of overloaded 'f(int&)' is ambiguous
c.f(i);
^
main.cpp:29:10: note: candidates are:
main.cpp:6:5: note: auto C::f(X&&) const & [with X = int&]
f(X &&) const &
^
main.cpp:11:5: note: auto C::f(X&&) & [with X = int&]
f(X &&) &
^
main.cpp:16:5: note: auto C::f(X&&) && [with X = int&]
f(X &&) &&
^
Aber im Falle von#if 1
und#if 0
, oder#if 0
und#if 1
Es wird normal kompiliert. Auch wenn ich alle ersetzeauto
ist mitvoid
gibts dann alle auch erfolgreich kompilieren.
Ist es ein Fehler oder nur meine Irreführung?