调用重载限定符成员函数的重载是不明确的

时间:2014-04-23 15:34:33

标签: c++ c++11 overload-resolution ref-qualifier

我发现了一个奇怪的行为,用 G ++ gcc 4.8.1和 MinGW 4.8.2与{{1}编译我的代码标志)。在SSCCE的精神中,我隔离了以下片段:

-std=gnu++1y

它出错了:

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;
}

但是在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 &&) && ^ #if 1,或#if 0#if 0的情况下,它会正常编译。此外,如果我用#if 1替换所有auto,那么所有编译也都会成功。

是错误,还是我的误导?

1 个答案:

答案 0 :(得分:4)

g ++ 4.8.2与更简单的(Live at coliru)具有相同的问题:

struct A {
    auto f() & {}
    auto f() && {}
};

int main() {
    A{}.f();
    A a;
    a.f();
}

尽管该程序显然是正确的。它似乎是引用限定符和返回类型推导之间相互作用的一个错误:推测推导过程在将它们移交给重载解析之前从隐式对象参数中剥离限定符。

我已将此报告为GCC bug 60943