Здравствуйте, C0x, Вы писали:
C0x>Здравствуйте, watchmaker, Вы писали:
W>>По стандарту допустимы оба варианта.
C0x>Тоесть это приведет к undefined behaviour?
Нет, конечно, undefined behaviour тут не будет.
Реализация вольна выбирать в каждом конкретном примере такого кода будет ли использовано copy elision или нет. Твоя программа может при использовании одного компилятора (или набора настроек компилятора) выдавать всегда "01", при использовании второго компилятора выдавать всегда "0", а при использовании третьего компилятора выдавать "01" в будни и "0" в выходные дни. Но в каждом случает это поведение полностью определено.
Здравствуйте, watchmaker, Вы писали:
W>Реализация вольна выбирать в каждом конкретном примере такого кода будет ли использовано copy elision или нет. Твоя программа может при использовании одного компилятора (или набора настроек компилятора) выдавать всегда "01", при использовании второго компилятора выдавать всегда "0", а при использовании третьего компилятора выдавать "01" в будни и "0" в выходные дни. Но в каждом случает это поведение полностью определено.
Из педивикии.
Неопределённое поведение (англ. undefined behaviour) — свойство некоторых языков программирования (наиболее заметно в Си), программных библиотек и аппаратного обеспечения в определённых маргинальных ситуациях выдавать результат, зависящий от реализации компилятора (библиотеки, микросхемы) и случайных параметров наподобие состояния памяти или сработавшего прерывания
Здравствуйте, C0x, Вы писали:
C0x>Здравствуйте, watchmaker, Вы писали:
W>>Реализация вольна выбирать в каждом конкретном примере такого кода будет ли использовано copy elision или нет. Твоя программа может при использовании одного компилятора (или набора настроек компилятора) выдавать всегда "01", при использовании второго компилятора выдавать всегда "0", а при использовании третьего компилятора выдавать "01" в будни и "0" в выходные дни. Но в каждом случает это поведение полностью определено.
C0x>Из педивикии.
C0x>
C0x>Неопределённое поведение (англ. undefined behaviour) — свойство некоторых языков программирования (наиболее заметно в Си), программных библиотек и аппаратного обеспечения в определённых маргинальных ситуациях выдавать результат, зависящий от реализации компилятора (библиотеки, микросхемы) и случайных параметров наподобие состояния памяти или сработавшего прерывания
C0x>Получается всетаки undefined behaviour.
не надо смотреть русскую (!) педивикию. смотри только стандарт.
в данном случае это называется implementation defined а ни как не UB
Здравствуйте, C0x, Вы писали:
C0x>Здравствуйте, watchmaker, Вы писали:
W>>Реализация вольна выбирать в каждом конкретном примере такого кода будет ли использовано copy elision или нет. Твоя программа может при использовании одного компилятора (или набора настроек компилятора) выдавать всегда "01", при использовании второго компилятора выдавать всегда "0", а при использовании третьего компилятора выдавать "01" в будни и "0" в выходные дни. Но в каждом случает это поведение полностью определено.
C0x>Из педивикии. C0x>Получается всетаки undefined behaviour.
Ну что такое? Ты же сам в первом сообщении спросил про стандарт! Если бы тебя волновало мнение из википедии, то так бы и спрашивал: "По википедии должен один раз конструктор вызваться или два?".
Ты понимаешь, что есть standard-defined behaviour, implementation-defined behavior, unspecified behavior и undefined behavior? И чем вообще все эти типы поведения отличаются?
Вот copy elision попадает в unspecified, а не не undefined behavior.
Смотри, вот аналогичная ситуация на примере многопоточности из c++11: у тебя есть функция, которая выводит номер потока, в котором её запустили. Ты запускаешь два потока с такой функцией (с номерами 0 и 1). Что выведет вся программа? «01» или «10»? Очевидно, что оба вараинта возможны — смотря какой поток первым получит доступ к выводу. И хотя вывод программы и не единственный, но неопределенного поведения тут нет. Так и стандарт в этом случае не говорит, что будет обязательно выведено «01» — вместо этого он говорит, что будет выведено только один из этих двух вариантов, и другие результаты невозможны.
Так и твоя ситуация описывается в стандарте: вывод будет либо «0», либо «01», но не что-то третье. Как реализация будет выбирать между «0» и «01» — не важно.