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