Podaj wartość lub odwołanie do konstruktora C ++, który musi przechowywać kopię?

Czy konstruktor wartości C ++ (niejawny lub jawny) powinien akceptować swój parametr (parametry) według wartości lub referencji do stałej, gdy musi przechowywać kopię argumentu (argumentów) w swoim obiekcie w dowolny sposób?

Oto najkrótszy przykład, jaki mogę wymyślić:

struct foo {
    bar _b;
    foo(bar [const&] b) // pass by value or reference-to-const?
        : _b(b) { }
};

Chodzi o to, że chcę zminimalizować wywołania konstruktora kopii baru, gdy tworzony jest obiekt foo, na dowolny z różnych sposobów, w jaki obiekt foo może zostać utworzony.

Zwróć uwagę, że wiem trochę o elisionie kopii i (nazwanej) optymalizacji wartości zwrotnej i przeczytałem„Chcesz prędkości? Pass by Value”, jednak nie sądzę, aby artykuł bezpośrednio odnosi się do tego przypadku użycia.

Edytować: Powinienem być bardziej szczegółowy.

Załóżmy, że nie mogę znaćsizeof(bar)lub czy niebar jest podstawowym, wbudowanym typem (bar może być parametrem szablonu ifoo może być szablonem klasy zamiast klasy). Nie zakładaj tegofookonstruktor można wstawić (lubbarw tym przypadku). Załóżmy, że przynajmniej mogę używać kompilatora, który implementuje RVO.

Chciałbym, aby istniała możliwość (pod warunkiem optymalizacji kompilatora), że takie wywołanie nie wywoła żadnych wywołańbarkonstruktor kopii w ogóle (nawet podczas wykonywania_b(b) wfoolista inicjalizacyjna):

foo f = function_that_creates_and_returns_a_bar_object_using_rvo();

Czy istnieje możliwość (biorąc pod uwagę standard C ++ 98), że można to zrobić, a jeśli tak, to czy jest bardziej lub mniej prawdopodobne, że będzie działać, jeślifoo akceptuje swój parametr przez referencję do stałej zamiast wartości?

questionAnswers(8)

yourAnswerToTheQuestion