2017-07-23 5 views
0

Ich habe eine Funktion, die ein std :: optionalErstellt ein Parameter std :: optional eine Kopie?

void foo(const std::optional<T>& opt);

Aber Kopieren T nimmt, ist expencive.

Erstellt dies eine Kopie von T?

Wenn ja, wie kann ich keine Kopie erstellen?

+2

Es kann keine Kopie erstellen, wenn Sie erklären, Nenne es nicht. Bitte poste ein [mcve]. – juanchopanza

+0

Es hängt wirklich davon ab, wie Sie die Funktion aufrufen. – Rakete1111

+3

Klingt wie du willst ein 'std :: optional >' stattdessen. – StoryTeller

Antwort

1

Ich denke, Sie finden nützliche . Siehe Abschnitt "Optionale Funktionsparameter".

Wenn Sie die Funktion aufrufen und eine Instanz von T übergeben, wird ein optionales Konstrukt erstellt, das seine eigene Kopie von T besitzt. Daher ruft es Ts Kopierkonstruktor auf.

int main() 
{ 
    T t; 
    optional<T> ot; 
    foo(t); // will create a copy 
    foo(ot); // won't create a copy 
} 

Um in der Lage sein, foo zu rufen und ein T passieren, ohne eine Kopie zu erstellen, können Sie foo als Aufnahme eine optionale Referenz, dh

void foo(optional<const T&> t) 
+0

Interessant. Danke für das Lesen. Ich hätte 'sizeof' gebraucht, um meine eigene Frage zu beantworten. Eine Frage, kann ich "const T &" wirklich als Template-Parameter angeben? Ich habe es ausprobiert und einen Fehler beim Erstellen von Verweisen auf Referenzen bekommen. Die Antwort von StoryTeller über std :: reference_wrapper funktioniert auf jeden Fall perfekt für mich. –

+2

Einfach einklopfen, um zu sagen, dass 'std :: optional' explizit Referenzen als den Typ, den es hält, verbietet. Das Komitee fühlte sich unbehaglich mit * optionalen Referenzen *, so dass die Funktionalität nicht durch Boost verbessert wurde. – StoryTeller

+0

@StoryTeller und Willy: Das war mir nicht bewusst, gut zu wissen! Um ehrlich zu sein, habe ich keinen C++ 17-konformen Compiler, also benutze ich immer boost :: optional, ich habe naiv angenommen, dass das, was für das gilt, auch für std :: optional gilt. – opetroch

Verwandte Themen