Я читаю о копировании elision (и как это должно быть гарантировано на C++ 17), и это немного меня смутило (я не уверен, что знаю вещи, которые, как я думал, знал раньше). Так вот минимальный тест:Что происходит в этом возвращении?
std::string nameof(int param)
{
switch (param)
{
case 1:
return "1"; // A
case 2:
return "2" // B
}
return std::string(); // C
}
Как я вижу это, случаи А и Б выполнить прямое строительство на возвращаемом значении, поэтому скопируйте элизию не имеет никакого значения здесь, в то время как случай C не может выполнять копирование Пропуска, потому что есть несколько обратных путей. Правильно ли эти допущения?
Кроме того, я хотел бы знать, если
- есть лучший способ написания выше (например, имеют
std::string retval;
и всегда возвращаются, что один или писать случаиA
иB
вreturn string("1")
и т.д.) - происходит какое-то движение, например
"1"
является временным, но я предполагаю, что он используется в качестве параметра для конструктораstd::string
- есть проблемы с оптимизацией, которую я пропустил (например, я считаю, что C может быть записано как
return{}
, было бы лучше?)
Почему вы думаете, случай А отличается от случая C. A эффективно 'станд :: строка ("1")' и 'С станд :: строка ("")' –
@KerrekSB Nothing –
@EdHeal Я считаю, что случай C должен быть эквивалентен 'std :: string (" 1 ")' copy elision должен произойти или нет никакой разницы от прямого построения в возвращаемом значении? Или множественные обратные пути возились с копией? Во всяком случае, это то, о чем я прошу, поэтому не спрашивайте меня. –