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 ersetzeautoist mitvoidgibts dann alle auch erfolgreich kompilieren.

Ist es ein Fehler oder nur meine Irreführung?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage