Дано:
void foo()
{
std::vector<int> v1;
std::vector<int> v2;
}
Гарантируется ли это, что v1
построен раньше v2
или порядок не определен? Я не могу найти ответ в стандарте (хотя я знаю, что он где-то там).
Если предположить, что оптимизация не происходит, то да, это покрывается проект стандарта C ++ в разделе 1.9
Выполнение программы параграф 14:
Каждое значение вычисления и побочный эффект, связанный с
полное выражение секвенируется перед каждым вычислением значения и стороной
эффект, связанный со следующим полным выражением для оценки.8
В действительности реализация обязана только подражать наблюдаемому поведению, которое называется как будто правило который описан в пункте 1 который говорит (акцент мой):
Семантические описания в этом международном стандарте определяют
параметризованная недетерминированная абстрактная машина. Этот международный
Стандарты не предъявляют никаких требований к структуре соответствия
Реализации. В частности, им не нужно копировать или эмулировать
структура абстрактной машины. Скорее, соответствующие реализации
должны эмулировать (только) наблюдаемое поведение абстрактного
машина как объяснено ниже.5
сноска 5
говорит:
Это положение иногда называют правилом «как будто», потому что
реализация свободна игнорировать любое требование этого
Международный стандарт до тех пор, пока результат, как если бы требование
было выполнено, насколько это можно определить из наблюдаемого
поведение программы. Например, фактическая потребность в реализации
не оценивать часть выражения, если оно может сделать вывод, что его значение
не используется и что никаких побочных эффектов, влияющих на наблюдаемое поведение
программа производится.
И да и нет. Гарантируется, что наблюдаемое поведение эквивалентно тому, что они построены в том порядке, в котором они объявлены, но из-за оптимизаций они могут вообще не быть построены.
Да, объекты всегда создаются в порядке их определения. То же самое, если вы делаете это в одной строке:
std::vector<int> v1, v2;
или если они являются членами класса:
struct foo()
{
std::vector<int> v1;
std::vector<int> v2;
};
Порядок построения — это порядок определения, а порядок уничтожения — противоположный.
Здесь нет необходимости вызывать правило «как будто». Какой бы смысл и поведение вы ни гарантировали при создании объекта, вы получите. Что бы не гарантировалось, никогда прежде не было частью языка или программы.