c ++中==运算符的相关性

时间:2017-03-10 15:28:59

标签: c++ associative

我在c ++中有这段代码:

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

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

2 个答案:

答案 0 :(得分:12)

这与关联性无关(在a == b == c等表达式中起作用)。您要问的是操作员操作数的评估顺序。通过一些明确列出的异常,这在C ++中是故意未指定的。这意味着无法保证a中是否会首先评估ba == b

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

  • 函数调用的所有参数都在函数调用之前进行求值(但是以未指定的顺序)。
  • 首先评估内置运算符||&&的左侧(如有必要,仅评估右侧)。< / LI>
  • 内置运算符,的左侧在右侧之前进行评估。
  • 在结果之前评估运算符?:中的条件,并且只评估其中一个结果。

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

答案 1 :(得分:4)

您不是要求operator ==的关联性,而是关于order of evaluation的关联性。并且此运算符未指定评估顺序,因此您必须假定订单始终不适合您。将您的陈述分成两行以保证安全。