7

当我用G++gcc 4.8.1 和MinGW 4.8.2 带-std=gnu++1y标志)编译我的代码时,我发现了一个奇怪的行为。本着 SSCCE 的精神,我隔离了以下代码段:

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 &&) &&
     ^

但是在 and 的情况下#if 1#if 0or #if 0and#if 1它可以正常编译。另外,如果我用 's 替换所有auto' voids,那么所有编译也会成功。

是错误,还是只是我的误导?

4

1 回答 1

4

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

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

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

尽管程序显然是正确的。这似乎是 ref-qualifiers 和 return type deduction 之间的交互中的一个 bug:推测 deduction 过程正在从隐式 object 参数中剥离 qualifiers,然后再将它们交给重载决议。

我已将此报告为GCC bug 60943

于 2014-04-23T19:55:28.983 回答