Извиняюсь заранее, я знаю, что общая тема оценочного порядка уже много вопросов SO. Однако, взглянув на них, я хочу прояснить несколько конкретных моментов, которые, как я думаю, не означает дублирование чего-либо. Предположим, у меня есть следующий код:
#include <iostream>
auto myLambda(int& n)
{
++n;
return [](int param) { std::cout << "param: " << param << std::endl; };
}
int main()
{
int n{0};
myLambda(n)(n);
return 0;
}
Программа выше выводит "n: 0" при компиляции. Здесь у нас есть неуказанный порядок в игре: он мог бы так же легко выводить "n: 1" имел другой порядок оценки.
Мои вопросы:
-
Что такое отношения последовательности при игре во время вызова последней функции (т.е. вызов лямбда-выражения), между постфиксным выражением
myLambda(0)
, его аргументомn
и последующим вызовом функции? -
Является ли приведенный выше пример undefined или неуказанного поведения - и почему именно (со ссылкой на стандарт)?
-
Если я изменил лямбда-код на
[](int param) { std::cout << "hello" << std::endl }
(т.е. сделал результат независимым от его параметра и, следовательно, любые решения порядка оценки, сделав поведение детерминированным), ответ на 2) выше все равно будет таким же?
EDIT: я изменил имя параметра лямбда от 'n' до 'param', потому что это, казалось, вызывало путаницу.