Увидев, что локальная ссылка на константу может продлить жизнь временного, я столкнулся с необходимостью условно привязать локальную ссылку-к-константе либо к параметру функции, либо к временному результату вызова функции, т.е.:
class Gizmo
{
// Rule of Five members implemented
};
Gizmo Frobnicate(const Gizmo& arg);
void ProcessGizmo(const Gizmo& arg, bool frobnicate)
{
const Foo& local = frobnicate ? Frobnicate(arg) : arg;
// Perform some work on local
}
Практический пример: логическое значение указывает, следует ли сжимать буфер, и вы хотите написать унифицированный код, который работает с local
в любом случае.
Однако приведенный выше пример вызывал конструктор копирования Gizmo для arg
, когда frobnicate
было false
. Мне удалось избежать вызова конструктора копирования, изменив Frobnicate(arg)
на static_cast<const Gizmo&>(Frobnicate(arg))
.
У меня возникает вопрос: как тернарный оператор взаимодействует с правилом о привязке локальной ссылки к константе к временной? Является ли мое решение законным и корректным?