Передать по значению или по ссылке в конструктор 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
конструктор может быть встроенным (илиbar
х, в этом отношении). Предположим, что я, по крайней мере, мог бы использовать компилятор, который реализует RVO.
Я хотел бы, чтобы была возможность (учитывая оптимизацию компилятора), что такой вызов не вызовет никаких вызововbar
Копировать конструктор вообще (даже при выполнении_b(b)
вfoo
список инициализации):
foo f = function_that_creates_and_returns_a_bar_object_using_rvo();
Есть ли возможность (учитывая стандарт C ++ 98), что это можно сделать, и если да, то более или менее вероятно, будет ли это работать, еслиfoo
принимает свой параметр по ссылке на const, а не по значению?