运算符在 C++ 中使用哪种重载?
Which overload does an operator use in C++?
每个人都知道您不能使用 + 运算符连接 2 个字符串文字。
#include <iostream>
int main() {
std::cout << "hello " + "world";
}
// Error
这里发生的事情是您试图添加 2 个字符*,这是一个错误。但是,您可以将字符串文字添加到 std::string.
#include <iostream>
int main() {
std::string s = "hello ";
std::cout << s + "world";
}
// Fine, prints hello world
但我发现下面的代码也是有效的。
#include <iostream>
int main() {
std::string s = "world";
std::cout << "hello " + s;
}
// Fine, prints hello world
我想在上面的示例中,您正在尝试将 std::string 添加到 char* 但它工作正常。我认为它可能只是使用了 + 运算符的 std::string 重载。我的问题是这里究竟发生了什么,以及操作员如何决定在诸如将 2 个不同的 类 完全有效的重载加在一起的情况下使用哪个重载。
What's happening here is that you are trying to add 2 char* which is an error.
为了更正确一点,您尝试添加两个数组,每个数组都衰减到 const char*
。
My question is what exactly is happening here
您正在使用这些重载:
std::string
operator+(const std::string& lhs, const char* rhs);
std::string
operator+(const char* lhs, const std::string& rhs);
how does the operator decide which overload to use
它使用与普通函数相同的重载决议。完整和精确的描述不适合这个答案,因为重载解析非常复杂。
简而言之:有一个所有同名函数的列表。这是超载集。如果所有参数(运算符重载情况下的操作数)都可以转换为函数的形式参数,那么该函数是重载决议的可行候选者。候选人按一套规则排名。要求“较少”转换的候选人排名较高。如果一个候选人明确地是排名最高的候选人,那么将调用该重载;否则会出错。
Operator precedence :+
的排名高于 <<
,因此该行被解析为:
(std::cout << ("hello " + s) );
而 operator+(const char*,const std::string&)
是第 4 位的那个:https://en.cppreference.com/w/cpp/string/basic_string/operator%2B。
也许您有点惊讶,因为运算符通常是成员函数,这意味着左操作数需要是 std::string
。然而,情况并非总是如此。运算符可以是自由函数。
每个人都知道您不能使用 + 运算符连接 2 个字符串文字。
#include <iostream>
int main() {
std::cout << "hello " + "world";
}
// Error
这里发生的事情是您试图添加 2 个字符*,这是一个错误。但是,您可以将字符串文字添加到 std::string.
#include <iostream>
int main() {
std::string s = "hello ";
std::cout << s + "world";
}
// Fine, prints hello world
但我发现下面的代码也是有效的。
#include <iostream>
int main() {
std::string s = "world";
std::cout << "hello " + s;
}
// Fine, prints hello world
我想在上面的示例中,您正在尝试将 std::string 添加到 char* 但它工作正常。我认为它可能只是使用了 + 运算符的 std::string 重载。我的问题是这里究竟发生了什么,以及操作员如何决定在诸如将 2 个不同的 类 完全有效的重载加在一起的情况下使用哪个重载。
What's happening here is that you are trying to add 2 char* which is an error.
为了更正确一点,您尝试添加两个数组,每个数组都衰减到 const char*
。
My question is what exactly is happening here
您正在使用这些重载:
std::string
operator+(const std::string& lhs, const char* rhs);
std::string
operator+(const char* lhs, const std::string& rhs);
how does the operator decide which overload to use
它使用与普通函数相同的重载决议。完整和精确的描述不适合这个答案,因为重载解析非常复杂。
简而言之:有一个所有同名函数的列表。这是超载集。如果所有参数(运算符重载情况下的操作数)都可以转换为函数的形式参数,那么该函数是重载决议的可行候选者。候选人按一套规则排名。要求“较少”转换的候选人排名较高。如果一个候选人明确地是排名最高的候选人,那么将调用该重载;否则会出错。
Operator precedence :+
的排名高于 <<
,因此该行被解析为:
(std::cout << ("hello " + s) );
而 operator+(const char*,const std::string&)
是第 4 位的那个:https://en.cppreference.com/w/cpp/string/basic_string/operator%2B。
也许您有点惊讶,因为运算符通常是成员函数,这意味着左操作数需要是 std::string
。然而,情况并非总是如此。运算符可以是自由函数。