Должен ли конструктор значений C ++ (неявный или явный) принимать свои параметры по значению или по ссылке на const, когда ему необходимо сохранить копию аргумента (ов) в своем объекте в любом случае?
Вот самый короткий пример, который я могу себе представить:
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, а не на значение?