c++中==运算符的结合性

Associativity of == operator in c++

我有这段 C++ 代码:

std::vector<int> v1;
std::vector<int> v2;
...
if (v1.insert(v1.end(), v2.begin(), v2.end()) == v1.end())
{
    return 0;
}

首先计算哪个表达式?调试时,首先评估“==”运算符的右侧,这是正确的行为吗?

这与结合性无关(它在 a == b == c 等表达式中发挥作用)。您要问的是运算符的操作数的评估顺序。除了一些明确列出的例外情况,这在 C++ 中是有意 未指定 的。这意味着无法保证 ab 是否会在 a == b.

中首先被评估

例外情况(保证评估顺序)是:

  • 函数调用的所有参数都在函数调用本身之前求值(但顺序未指定)。
  • 内置 运算符 ||&& 的左侧首先求值(右侧仅求值如有必要)。
  • 内置运算符,的左侧先于右侧计算。
  • 运算符 ?: 中的条件在结果之前求值,并且只求一个结果。

请注意,当重载这些运算符时,&&||, 的特殊属性将不再适用。这正是为什么重载这三个运算符是一个 糟糕 想法的原因。

你问的不是 operator == 的结合律,而是 order of evaluation 的结合律。并且此运算符的评估顺序未指定,因此您必须假设该顺序始终不适合您。为了安全起见,将您的声明分成两行。