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

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

概述当用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 当用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 – 使用ref-qualifiers成员函数重载调用是不明确的全部内容,希望文章能够帮你解决c – 使用ref-qualifiers成员函数重载调用是不明确的所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1240295.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存