当用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.