У меня есть этот фрагмент кода в 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 ++. Это означает, что нет никакой гарантии, a
или же b
будет оцениваться первым в a == b
,
Исключения (для которых порядок оценки гарантирован):
||
а также &&
оценивается первым (и правая часть оценивается только при необходимости).,
оценивается перед правой частью.?:
оценивается перед последовательным, и оценивается только один из последовательных.Обратите внимание, что специальные свойства &&
, ||
, а также ,
перестать применяться, когда эти операторы перегружены. Именно поэтому это плохой Идея перегрузить эти три оператора.
Вы не просите об ассоциативности operator ==
, но о порядок оценки. И порядок оценки для этого оператора не определен, поэтому вы должны предположить, что этот порядок всегда тот, который у вас не работает. Разделите ваше заявление на две строки, чтобы быть в безопасности.