«Оптимизация возвращаемого значения» вызывает неопределенное поведение? - PullRequest
5 голосов
/ 24 февраля 2010

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

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

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

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

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

Ответы [ 4 ]

12 голосов
/ 24 февраля 2010

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

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

2 голосов
/ 24 февраля 2010

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

См .: Носовые Демоны

1 голос
/ 24 февраля 2010
0 голосов
/ 24 февраля 2010

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

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

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

...