Передать по значению или по ссылке в конструктор 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 может быть шаблоном класса вместо класса). Кроме того, нене могу предположить, чтоfoos конструктор может быть встроенным (или 'barс, в этом отношении). Предположим, что я, по крайней мере, мог бы использовать компилятор, который реализует RVO.

Я хотел бы, чтобы была возможность (учитывая оптимизацию компилятора), что такой вызов не вызовет никаких вызовов 'bars конструктор копирования вообще (даже при выполнении_b(b) в 'foos список инициализации):

foo f = function_that_creates_and_returns_a_bar_object_using_rvo();

Есть ли возможность (учитывая стандарт C ++ 98), что это можно сделать, и если да, то более или менее вероятно, будет ли это работать, еслиfoo принимает свой параметр по ссылке на const, а не по значению?

Ответы на вопрос(8)

Ваш ответ на вопрос