阅读“ 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或枚举类型的参数
我有两个问题。
这是语言规范的一部分吗?如果是,为什么C ++设计人员要这样做?
std::string
具有类似的构造函数string (const char* s);
,这意味着编译器可以执行从char*
到的隐式类类型转换string
。当我们调用时"hello"+"world"
,编译器为什么不将两个char*
“ s”转换为两个字符串呢?毕竟,两个std :: strings上都有一个重载的“ +”。string operator+ (const string& lhs, const string& rhs);
- 这是语言规范的一部分吗?
是的。为什么?好吧,主要原因可能是因为重新定义标准类型的常规运算符被认为是令人困惑的。想象一下过载operator+(int,int)
或operator+(int,char*)
。那将改变现有代码的含义!
您可能会争辩说,标准类型之间存在未定义的运算符,因此可以放心地覆盖它们,例如operator*(char*,int)
,但这通常被认为是无用的。
此外,运算符重载必须是全局的(或在其某些成员的命名空间中(取决于参数的查找),但是对于标准类型,没有依赖的命名空间),因此希望覆盖它们的库之间的互操作性将是一个问题。恶梦。
"hello" + "world"
:为什么编译器不将两个char *转换为两个字符串?
好吧,因为它std::operator+(const std::string&, const std::string&)
已经存在,namespace std;
所以默认情况下不会找到它。
您可以尝试显式调用该运算符:std::operator+("hello", "world")
,但是,operator+()
过载如此之多,其中有许多模板,使得调用是模棱两可的。
因此,考虑到所有这些因素,我认为一个合理的要求是至少有一个运算符为用户定义类型。想一想:解决了全局和名称空间问题,可以使用ADL(实际上是为此而发明的),并且不可能用现有含义重新定义运算符(我operator,()
和operator&()
,但我想,但谁想重写这些含义)...)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句