Прежде всего, несколько предположений:
Мы смотрим на функции, которые не являются встроенными.В этом случае почти гарантировано, что он будет абсолютно эквивалентен.
Мы собираемся предположить, что сайты вызова функции действительно проверяют состояние ошибки перед использованием возвращенного значения.
Мы будем предполагать, что возвращаемое значение не было предварительно инициализировано с частичными данными.
Мы собираемся предположить, что мы толькозаботьтесь об оптимизированном коде здесь.
Это устанавливается:
Я знаю, что на стандартном уровне NRVO не является обязательным (в отличие от RVO в c ++17) но практически есть ли вероятность, что это не произойдет ни в одном из основных компиляторов?
Предполагается, что NRVO выполняется на данном этапе, это безопасная ставка.Я уверен, что кто-то может придумать надуманную ситуацию, когда этого не произойдет, но я в целом уверен, что почти во всех случаях использования NRVO выполняется на современных современных компиляторах.
При этомЯ бы никогда не стал полагаться на это поведение для программы правильность .То есть я бы не стал создавать странный конструктор копирования с побочными эффектами, предполагая, что он не вызывается из-за NRVO.
Есть ли преимущества использования параметров вместо NRVO?
В общем, нет, но, как и все в C ++, существуют крайние сценарии, в которых он может возникнуть.Явные схемы памяти для максимизации когерентности кэша были бы хорошим вариантом использования для «возврата по указателю».
Если предположить, что произойдет NRVO, произойдет ли существенное изменение в сгенерированной сборке (при условии оптимизации ожидаемой реализации [возможно, с логическим значением, представляющим, исчезла ли ошибка полностью]]?
Этот вопрос не имеет для меня особого смысла.expected<>
ведет себя намного больше как variant<>
, чем tuple<>
, поэтому «логическое представление, означающее, что ошибка полностью исчезла», на самом деле не имеет смысла.
При этом, я думаю, что мыможно использовать std :: option для оценки:
https://godbolt.org/g/XpqLLG
Это "другое", но не обязательно лучше или хуже, на мой взгляд.