gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:37:47 24 4
gpt4 key购买 nike

当使用 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 的情况下> 编译正常。此外,如果我将所有 auto 替换为 void,那么所有编译也会成功。

是bug还是我的误导?

最佳答案

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

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

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

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

我已将其报告为 GCC bug 60943 .

关于c++ - 使用 ref-qualifiers 成员函数重载的调用不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23249038/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com