Czytam na elizji kopiowania (i jak to powinno być zagwarantowane w C++ 17) i to mnie trochę zmieszało (nie jestem pewien, czy znam rzeczy, o których myślałem wcześniej). Więc tutaj jest minimalny przypadek testowy:Co dzieje się w tym oświadczeniu zwrotu?
std::string nameof(int param)
{
switch (param)
{
case 1:
return "1"; // A
case 2:
return "2" // B
}
return std::string(); // C
}
Tak jak ja to widzę, przypadków A i B przeprowadzić bezpośrednią budowę o wartości zwracanej więc skopiować elizja nie ma sensu tutaj, natomiast sprawa C nie może wykonać kopii elizja ponieważ istnieje wiele ścieżek powrotu. Czy te założenia są prawidłowe?
Również chciałbym wiedzieć, czy
- istnieje lepszy sposób pisania wyżej (np mieć
std::string retval;
i zawsze wrócić, że jeden lub napisać SzafyA
iB
jakreturn string("1")
etc) - zdarza się jakikolwiek ruch, na przykład
"1"
jest tymczasowy, ale zakładam, że jest on używany jako parametr dla konstruktorastd::string
- są obawy dotyczące optymalizacji, które zostały pominięte (np. Wierzę, że C może być napisane jako
return{}
, czy byłby to lepszy wybór?)
Dlaczego sądzisz przypadek A różni się od przypadku C. A jest skutecznie 'std :: string ("1")' 'i C jest std :: string ("")' –
@KerrekSB Nic –
@EdHeal Wierzę, że przypadek C jest równoważny 'std :: string (" 1 ")' elision copy musi nastąpić, czy nie ma żadnej różnicy od bezpośredniego konstruowania do wartości zwracanej? A może wiele ścieżek zwrotnych miesza się z elizacją kopiowania? Tak czy inaczej, o to pytam, więc nie pytaj mnie –