порядок вычисления — строковый оператор C ++ STL + ассоциативность

Я опробовал следующий код в VC ++ 2015

#include <iostream>
#include <string>

using namespace std;

int foo(int v)
{
cout << v << endl;
return 10;
}

string bar(int v)
{
cout << v << endl;
return "10";
}

int main()
{
auto a = foo(1) + foo(2) + foo(3);
auto b = bar(10) + bar(20) + bar(30);
cout << "----" << endl << a << endl << b << endl;
return 0;
}

Результат на консоли выглядит следующим образом

1
2
3
30
20
10
----
30
101010

Как мы все знаем, бинарный оператор + имеет ассоциативность слева направо, и это может быть подтверждено 3 вызовами foo, Они вызываются слева направо по порядку инструкций.

Мой вопрос: почему это не так для string::operator+? Я попал в некоторые недоразумения?

4

Решение

Вы запутались между ассоциативность а также заказ или оценка.

Порядок оценки аргументов не указан в C ++. Ассоциативность operator + слева направо, как вы упомянули.

Чтобы понять это, попробуйте подобный фрагмент кода с operator -


От Заказ или оценка (акцент мой)

За исключением случаев, указанных ниже, не существует понятия слева направо или
оценка справа налево в C ++. Это не следует путать с
ассоциативность операторов слева направо и справа налево
:
выражение f1 () + f2 () + f3 () анализируется как (f1 () + f2 ()) + f3 () из-за
ассоциативность слева направо оператора +, но вызов функции к f3
может оцениваться первым, последним или между f1 () или f2 () во время выполнения.

8

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

Вы предполагаете, что компилятор испускает код для вызова функции непосредственно перед выполнением оператора сложения. Это не обязательно правда. Фактическая последовательность операций может быть просто:

  1. Панель вызовов (30), сохраните результат.
  2. Вызовите панель (20), сохраните результат.
  3. Вызовите панель (10), сохраните результат.
  4. Добавьте результаты из шага 3 и шага 2.
  5. Добавьте результаты из шага 4 и шага 1.

Конечно, поскольку сложение симметрично, порядок сложения на самом деле не имеет значения.

C ++ не требует, в этом случае, вызов функции должен происходить немедленно вместе с дополнением. Правила, регулирующие порядок оценки, на самом деле довольно сложны. Достаточно сказать, что в этом случае порядок вызовов функций не указан, и каждая реализация C ++ может выполнять вызовы функций в любом относительном порядке. Фактически, относительный порядок может отличаться при каждом запуске программы (конечно, маловероятно, но это все равно будет соответствовать требованиям).

4

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