ассоциативный — Ассоциативность оператора == в переполнении стека

У меня есть этот фрагмент кода в C ++:

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

Какое выражение будет оцениваться первым? При отладке сначала оценивается правая часть оператора «==», это правильное поведение?

4

Решение

Это не имеет ничего общего с ассоциативностью (которая появляется в выражениях типа a == b == c). То, о чем вы спрашиваете, это порядок вычисления операндов оператора. За некоторыми явно перечисленными исключениями, это намеренно неопределенные в C ++. Это означает, что нет никакой гарантии, a или же b будет оцениваться первым в a == b,

Исключения (для которых порядок оценки гарантирован):

  • Все аргументы вызова функции оцениваются до самого вызова функции (но в неуказанном порядке).
  • Левая сторона встроенный операторы || а также && оценивается первым (и правая часть оценивается только при необходимости).
  • Левая сторона встроенный оператор , оценивается перед правой частью.
  • Состояние в операторе ?: оценивается перед последовательным, и оценивается только один из последовательных.

Обратите внимание, что специальные свойства &&, ||, а также , перестать применяться, когда эти операторы перегружены. Именно поэтому это плохой Идея перегрузить эти три оператора.

12

Другие решения

Вы не просите об ассоциативности operator ==, но о порядок оценки. И порядок оценки для этого оператора не определен, поэтому вы должны предположить, что этот порядок всегда тот, который у вас не работает. Разделите ваше заявление на две строки, чтобы быть в безопасности.

4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector