为什么C ++运算符重载需要“至少具有一个类类型的参数”?

Peng Zhang

阅读“ C ++入门手册第5版”的第14.1章,

操作员函数必须是类的成员,或者至少具有一个类类型的参数。

例如,string("hello")+"world"编译"hello"+"world"不。当我想重载+两个C字符串时。

std::string operator+ (const char* s1, const char* s2)

我收到以下错误。

错误:“ std :: string运算符+(const char *,const char *)”必须具有class或枚举类型的参数

我有两个问题。

  1. 这是语言规范的一部分吗?如果是,为什么C ++设计人员要这样做?

  2. std::string具有类似的构造函数string (const char* s);,这意味着编译器可以执行从char*到的隐式类类型转换string当我们调用时"hello"+"world"编译器为什么不将两个char*“ s”转换为两个字符串呢?毕竟,两个std :: strings上都有一个重载的“ +”。string operator+ (const string& lhs, const string& rhs);

罗德里戈
  1. 这是语言规范的一部分吗?

是的。为什么?好吧,主要原因可能是因为重新定义标准类型的常规运算符被认为是令人困惑的。想象一下过载operator+(int,int)operator+(int,char*)那将改变现有代码的含义!

您可能会争辩说,标准类型之间存在未定义的运算符,因此可以放心地覆盖它们,例如operator*(char*,int),但这通常被认为是无用的。

此外,运算符重载必须是全局的(或在其某些成员的命名空间中(取决于参数的查找),但是对于标准类型,没有依赖的命名空间),因此希望覆盖它们的库之间的互操作性将是一个问题。恶梦。

  1. "hello" + "world":为什么编译器不将两个char *转换为两个字符串?

好吧,因为它std::operator+(const std::string&, const std::string&)已经存在,namespace std;所以默认情况下不会找到它。

您可以尝试显式调用该运算符:std::operator+("hello", "world"),但是,operator+()过载如此之多,其中有许多模板,使得调用是模棱两可的。

因此,考虑到所有这些因素,我认为一个合理的要求是至少有一个运算符为用户定义类型。想一想:解决了全局和名称空间问题,可以使用ADL(实际上是为此而发明的),并且不可能用现有含义重新定义运算符(operator,()operator&(),但我想,但谁想重写这些含义)...)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有非类型参数的 C++ 模板类:如何重载赋值运算符?

在C ++中的类中使用'const'和运算符重载是否有一个好的规则?

C ++重载另一个类的赋值运算符

运算符 << 在 C++ 中,“没有找到需要右手运算符的运算符”和“已经有一个主体”错误

为什么 std::optional 对 std::nullopt 类型的操作数有一个特殊的相等运算符

用于具有不同数据类型的两个对象的 C++ 重载 + 运算符

成员运算符'%'必须至少具有一个'ViewController'类型的参数

成员运算符'=='必须至少具有一个类型的参数

为什么插入/提取运算符的重载函数需要ostream / istream参数?

Java为什么不需要运算符重载?

为什么在运算符重载中需要引用?

<<重载运算符,为什么它不能仅返回类类型(无参考)

在C ++中使用Assignment运算符重载将一个类对象的数据复制到另一个类对象时出错

我们可以通过 C++ 中的运算符重载将一个类数据转换为另一个类吗?

在C ++中使用带有const类型输入参数的函数内部使用运算符重载

具有不同参数的C ++运算符重载模板

运算符=在C ++中具有不同参数的重载?

C ++中具有模板相关类型的重载运算符“ <<”

Isabelle函数为什么必须至少具有一个参数?

为什么我不能有一个纯粹的虚拟赋值运算符?

为什么不只有一个?复制构造函数和赋值运算符

为什么C ++需要运算符同义词?

为什么 C++ 有时不能识别重载运算符?

为什么在带有多个参数的重载运算符+中传递const引用

为什么D中的char []数组没有引发Result类型的[]运算符重载?

为什么SceneKit中没有运算符重载?

C ++运算符重载> =,具有2个不同的返回值

C ++:运算符=具有多态性的重载

为什么元类上的.mro()具有不同的签名?'type'对象的'descriptor'mro'需要一个参数`