c – 使用ref-qualifiers成员函数重载调用是不明确的

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

但是在#if 1和#if 0,或#if 0和#if 1的情况下,它正常编译.此外,如果我用void替换所有auto,那么所有编译也成功.

错误,还是我的误导?

解决方法

g 4.8.2与更简单的( Live at coliru)具有相同的问题:
struct A {
    auto f() & {}
    auto f() && {}
};

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

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

我已将此报告为GCC bug 60943.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...