Я бы сказал, что это pass-by-copy -
. Рассмотрение аргументов и объектов переменных - это объекты, созданные во время контекста выполнения, созданного в начале вызова функции, - и ваше фактическое значение / ссылка, переданная в функция просто хранится в этих аргументах + объекты переменных.
Проще говоря, для примитивных типов значения копируются в начале вызова функции, для типа объекта ссылка копируется.
Нет, такой гарантии нет. Он не определен в соответствии со стандартом C ++.
Bjarne Stroustrup также явно говорит об этом в разделе «Язык программирования C ++», раздел 6.2.2, с некоторыми аргументами:
Better код может быть сгенерирован при отсутствии ограничений на порядок оценки выражения
blockquote>Хотя это технически относится к более ранней части того же раздела, где говорится, что порядок оценки частей выражения также undefined, т.е.
int x = f(2) + g(3); // undefined whether f() or g() is called first
Из [5.2.2] Вызов функции,
Порядок оценки аргументов неуточнен. Все побочные эффекты оценок выражения аргументов вступают в силу до ввода функции.
blockquote>Поэтому нет гарантии, что
bar()
будет работать доbaz()
, толькоbar()
иbaz()
будет вызываться доfoo
.Также обратите внимание на [5] Выражения, что:
, за исключением тех случаев, когда отмечено [eg специальные правила для
blockquote>&&
и||
], порядок оценки операндов отдельных операторов и подвыражений отдельных выражений и порядок, в котором происходят побочные эффекты, не определены., поэтому даже если вы спрашиваете, будет ли
bar()
работать доbaz()
вfoo(bar() + baz())
, порядок все еще не указан.
&
, &&
гарантирует оценку слева направо: второй операнд не оценивается, если первый операнд false
.
– Daniel Trebbien
29 May 2010 в 13:31
Как уже отмечалось другими, стандарт не дает никаких указаний относительно порядка оценки для этого конкретного сценария. Затем этот порядок оценки передается компилятору, и у компилятора может быть гарантия.
Важно помнить, что стандарт C ++ - это действительно язык, который должен дать указание компилятору о создании сборки / машинного кода. Стандарт - это только одна часть уравнения. Если стандарт неоднозначен или определен конкретно для реализации, вы должны обратиться к компилятору и понять, как он переводит инструкции C ++ в настоящий машинный язык.
Итак, если порядок оценки является требованием или, по крайней мере, и совместимость с кросс-компилятором не является обязательным требованием, расследуйте, как ваш компилятор в конечном итоге сочтет это вместе, ваш ответ может окончательно лежать там. Обратите внимание, что компилятор может изменить свою методологию в будущем
В C ++ 11 соответствующий текст можно найти в 8.3.6. Аргументы по умолчанию / 9 (Emphasis mine)
По умолчанию аргументы оцениваются каждый раз функция вызывается. Порядок оценки аргументов функции не указан. Следовательно, параметры функции не должны использоваться в аргументе по умолчанию, даже если они не оцениваются.
blockquote>То же словосочетание используется также стандартом C ++ 14, и оно найдено в тот же раздел .
C ++ 17 задает порядок оценки для операторов, которые были неопределены до C ++ 17. См. Вопрос . Каковы гарантии порядка оценки, введенные C ++ 17? Но обратите внимание, что ваше выражение
foo(bar(), baz())
имеет неуказанный порядок оценки.
Нет никаких указаний на bar () и baz () - единственное, что Стандарт говорит, что они оба будут оценены до вызова foo (). Из стандарта C ++, раздел 5.2.2 / 8:
Порядок оценки аргументов неуточнен.
blockquote>