Передать по значению или по ссылке в конструктор 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, а не по значению?

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

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