当我用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 0
or #if 0
and#if 1
它可以正常编译。另外,如果我用 's 替换所有auto
' void
s,那么所有编译也会成功。
是错误,还是只是我的误导?