运算符在 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。然而,情况并非总是如此。运算符可以是自由函数。