首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于功能/操作符重载的混淆

关于功能/操作符重载的混淆
EN

Stack Overflow用户
提问于 2014-09-09 20:07:56
回答 1查看 280关注 0票数 1

考虑下面的自给程序。

代码语言:javascript
运行
复制
#include <iostream>
template<typename Ty>
struct Foo
{
    Foo& operator=(Foo foo){ return foo; }    
private:
    Foo& operator=(Foo& foo){ return foo; }
};
template<typename Ty>
struct Bar
{
    template<typename U>
    Bar& operator=(Bar<U> bar){ return bar; }
private:
    Bar& operator=(Bar& bar){ return bar; }
};

int main()
{
    Foo<int> f1, f2;
    f1 = f2;            // (1)
    Bar<int> b1, b2;
    b1 = b2;            // (2)
    f1 = Foo<int>(f2);  // (3)
    b1 = Bar<int>(b2);  // (4)
}

FooBar都重载赋值操作符,在使用这两个操作符时,都无法编译,除非我们显式地将其转换为对象的类型。另外,来自FooBar的分配都失败了,但是失败是不同的。注意,当基于引用和值重载函数时,我理解为什么调用是不明确的。但我不明白的是

  1. 为什么使用显式模板参数会更改编译器失败。语句(1)和(2)给出不同的错误,其中(1)声称调用是不明确的,其中(2)声称它不能访问私有数据成员。为了前夫。在用VC++编译(与g++类似的行为)时,我看到以下错误 1>Source.cpp(8):警告C4522:'Foo‘:多个指定的赋值操作符指定了1> Source.cpp(20):参见对正在编译的类模板实例化'Foo’的引用1>Source.cpp(21):错误C2593:'operator =‘是歧义的1> Source.cpp(7):可能是'Foo &Foo::operator =(Foo &)’1> Source.cpp(5):或'Foo &Foo::运算符=(Foo)‘1>,同时试图匹配参数列表(Foo,1>Source.cpp(23):C2248:'Bar::operator =‘:无法访问类'Bar’1> Source.cpp(15)中声明的私有成员:参见'Bar::operator =‘的声明
  2. 为什么我执行显式转换的(3)和(4)都不会失败。为什么它不是模棱两可的,或者它试图访问引用重载,这是私有的。
  3. 为什么在(2)情况下,它优先考虑引用重载,而不是值重载函数/运算符。

Note是一个依佩恩版本,以防您想要使用代码。备注请提供适当的参考资料。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-09 20:14:41

  1. 对于过载解决方法而言,Foo::operator=的这两个重载都是同样好的匹配--因此模糊不清。对于Bar::operator=来说,情况并非如此--其他条件相同,重载解决方案更倾向于非模板而不是模板。因此,私有operator=是一个更好的匹配-但当然,它会失败访问检查。
  2. Foo<int>(f2)是临时的,不能绑定到非const引用.根据值获取其参数的重载是唯一可行的选择。
  3. 它不优先于引用重载,而是优先于非模板重载。你可以通过转换它们来确认这一点。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25752780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档