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

前端之家收集整理的这篇文章主要介绍了为什么C运算符重载需要“至少有一个类类型的参数”?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
“C primer 5th edition”第14.1章,

An operator function must either be a member of a class or have at least one parameter of class type.

例如,字符串(“hello”)“world”编译“hello”“world”不会.当我想重载两个C字符串时.

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

我收到以下错误.

error: ‘std::string operator+(const char*,const char*)’ must have an argument of class or enumerated type

我有两个问题.

>这个限制是语言规范的一部分吗?如果是的话,为什么C设计师想要这样做?
> std :: string的构造函数类似于string(const char * s);,这意味着编译器可以执行从char *到string的隐式类类型转换.当我们调用“hello”“world”时,为什么编译器不会将两个char *“s转换为两个字符串?毕竟,在两个std :: strings上有一个重载”.
string运算符(const string& lhs,const string& rhs);

解决方法

  1. Is this restriction part of the language specification?

是的.为什么?好吧,主要原因可能是因为重新定义标准类型的常用运算符被视为混淆. Imagin重载operator(int,int)或operator(int,char *).这将改变现有代码的含义!

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

此外,运算符重载必须是全局的(或者在其某些成员的名称空间中(依赖于参数的查找),但是对于标准类型,没有可供依赖的名称空间),因此想要覆盖它们的库之间的互操作性将是恶梦.

  1. "hello" + "world": why doesn’t the compiler convert the two char* “s to two strings?

好吧,对于一个,std :: operator(const std :: string&,const std :: string&)在命名空间std中;所以默认情况下不会找到它.

您可以尝试显式调用运算符:std :: operator(“hello”,“world”),但是,有很多运算符()重载,其中许多是模板,调用是不明确的.

因此,考虑到所有这些因素,我认为合理的要求是至少有一个操作符属于用户定义的类型.想一想:全局命名空间问题得到解决,可以使用ADL(实际上它是为此用途而发明的)并且不可能重新定义具有现有含义的运算符(除了运算符,()和运算符&(),I想想,但是谁想要覆盖这些……).

原文链接:https://www.f2er.com/c/116246.html

猜你在找的C&C++相关文章