Вызывает ли “Оптимизация возвращаемого значения” неопределенное поведение?

StackOverflow https://stackoverflow.com/questions/2323940

  •  22-09-2019
  •  | 
  •  

Вопрос

Чтение это Статья в Википедии, указанная одним из ответчиков на следующий вопрос:

Конструктор копирования C ++, временные файлы и семантика копирования

Я наткнулся на эту строку

В зависимости от компилятора и настроек компилятора результирующая программа может отображать любой из следующих выходных данных:

Разве это не относится к неопределенному поведению?Я знаю, что в статье говорится Depending on the compiler and settings но я просто хочу прояснить это.

Это было полезно?

Решение

Нет, это не неопределенное поведение.Неопределенное поведение имеет конкретное определение в стандарте (в основном:"поведение, такое, которое может возникнуть при использовании ошибочной конструкции программы или ошибочных данных, к которым настоящий Международный стандарт не предъявляет никаких требований".) В этом случае поведение не указано, но не определено.

Разница в том, что любое выполнение чего-либо с неопределенным поведением делает все поведение вашей программы неопределенным (т.е.случиться может все, что угодно).При таком конкретном неуказанном поведении может произойти только одна из двух вещей:либо конструктор копирования выполняется, либо нет.

Другие советы

Нет.Поведение определено как один из выходных данных в списке.Неопределенное поведение включает в себя демонов, вылетающих из вашего носа.

Видишь: Носовые Демоны

неопределенное поведение сильно отличается от поведение , определяемое реализацией, о чем здесь идет речь.

Зависит от того, что вы подразумеваете под неопределенным.Я верю тому, что здесь говорили другие - по определению, используемому в стандартах.Но я также знаю, что когда кто-то говорит "либо это, либо то, я не говорю вам, что именно", я думаю об этом как о неопределенном поведении.

Однако это не имеет большого значения, так как это никогда не должно приводить к ошибке.Когда вы определяете определенные методы, ожидается, что вы будете определять их в соответствии с определенными соглашениями - это своего рода неявный контракт между вами, компилятором и людьми, которые будут использовать и поддерживать ваш код.

В этом случае, независимо от того, получаете ли вы конструкцию копирования и т.д. или оптимизированное поведение, ожидается, что эффект будет одинаковым - вызывающий получает требуемое значение.Если ваш конструктор копирования печатает "Hello World!" или имеет другие неподходящие побочные эффекты, он не реализует ожидаемое поведение конструктора, так что вина за нарушение контракта лежит на вас.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top