【发布时间】:2014-06-23 16:47:45
【问题描述】:
《C++入门第5版》第14.1章内容如下,
操作符函数必须要么是类的成员,要么至少有一个类类型的参数。
例如,string("hello")+"world" 编译 "hello"+"world" 不会。当我想在两个 C 字符串上重载 + 时。
std::string operator+ (const char* s1, const char* s2)
我收到以下错误。
错误:'std::string operator+(const char*, const char*)' 必须有一个类或枚举类型的参数
我有两个问题。
这个限制是语言规范的一部分吗?如果是,为什么 C++ 设计者要这样做?
std::string具有类似string (const char* s);的构造函数,这意味着编译器可以进行从char*到string的隐式类类型转换。当我们调用"hello"+"world"时,为什么编译器不把两个char*"s 转换成两个字符串呢? 毕竟两个std::strings 上有一个重载的"+"。string operator+ (const string& lhs, const string& rhs);
【问题讨论】:
-
如果你可以重载两个指针的加法,这将创建一些“有趣”的指针算法。
-
@Anycorn Brilliant。在我定义了 string_add (std::string s1, std::string s2) 之后,我可以毫无问题地调用 "string_add("hello", "world")"。因此,只要函数不是运算符重载,似乎就有隐式转换。
-
@PengZhang 那是因为 std::string 可以从 char* 构造。顺序是,从
char*构造 s1,从char*构造 s2,然后将这些临时变量传递给您的函数。 -
@W.B.有运算符重载“字符串运算符+(const string& lhs, const string& rhs);”为什么编译器不将两个 C 字符串转换为 std::strings 并匹配“运算符 +”?函数匹配和类型转换,先执行哪一个?
-
我相信如果一种类型不是内置的就足够了,例如一个枚举。
标签: c++ c++11 operator-overloading