我在c ++中有这段代码:
std::vector<int> v1;
std::vector<int> v2;
...
if (v1.insert(v1.end(), v2.begin(), v2.end()) == v1.end())
{
return 0;
}
首先评估哪个表达式?调试时,右侧是&#34; ==&#34;首先评估运算符,这是正确的行为吗?
答案 0 :(得分:12)
这与关联性无关(在a == b == c
等表达式中起作用)。您要问的是操作员操作数的评估顺序。通过一些明确列出的异常,这在C ++中是故意未指定的。这意味着无法保证a
中是否会首先评估b
或a == b
。
例外(保证评估顺序)是:
||
和&&
的左侧(如有必要,仅评估右侧)。< / LI>
,
的左侧在右侧之前进行评估。?:
中的条件,并且只评估其中一个结果。请注意,&&
,||
和,
的特殊属性在这些运算符过载时不再适用。这正是为什么糟糕的想法使这三个运算符超载的原因。
答案 1 :(得分:4)
您不是要求operator ==
的关联性,而是关于order of evaluation的关联性。并且此运算符未指定评估顺序,因此您必须假定订单始终不适合您。将您的陈述分成两行以保证安全。