Должен ли конструктор значений C ++ (неявный или явный) принимать свои параметры по значению или по ссылке на константу, когда ему в любом случае необходимо сохранить копию аргумента (ов) в своем объекте?
Вот самый короткий пример, который я могу придумать:
struct foo {
bar _b;
foo(bar [const&] b) // pass by value or reference-to-const?
: _b(b) { }
};
Идея здесь в том, что я хочу минимизировать вызовы конструктора копирования bar при создании объекта foo любым из различных способов, которыми может быть создан объект foo.
Обратите внимание, что я немного знаю о копировании и оптимизации (именованных) возвращаемых значений, и я прочитал " Хотите скорость? Передавать по значению ", однако я не думаю, что статья напрямую касается этого варианта использования.
Изменить: я должен быть более конкретным.
Предположим, что я не могу знать sizeof(bar)
и является ли bar
фундаментальным встроенным типом (bar
может быть параметром шаблона, а foo
может быть шаблоном класса вместо класса). Кроме того, не предполагайте, что конструктор foo
может быть встроенным (или bar
, если на то пошло). Предполагаю, что я, по крайней мере, мог бы использовать компилятор, реализующий RVO.
Я бы хотел, чтобы была возможность (с учетом оптимизации компилятора), что такой вызов вообще не будет вызывать никаких вызовов конструктора копирования bar
(даже при выполнении _b(b)
в списке инициализации foo
):
foo f = function_that_creates_and_returns_a_bar_object_using_rvo();
Есть ли возможность (учитывая стандарт C ++ 98), что это можно сделать, и если да, то будет ли это с большей или меньшей вероятностью работать, если foo
принимает свой параметр по ссылке на const, а не по значению?