Mediumcopy-elision
Что такое copy elision в аргументах функции?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
Copy elision (C++17 mandatory для prvalues) применяется и при передаче аргументов: prvalue инициализирует параметр напрямую, без copy/move.
void f(std::string s);
f(std::string("hi")); // C++17: guaranteed, prvalue напрямую в s
f("hi"); // то же самое
// Можно возвращать не-moveable типы — нет copy/move вообще
struct Lock {
Lock(std::mutex&);
Lock(Lock&&) = delete;
};
Lock make_lock(std::mutex& m) { return Lock(m); } // OK в C++17Но для именованного lvalue T x; f(std::move(x)); — это move, не elision. NRVO в T f() { T x; return x; } — опционально (даже в C++20), но реально работает.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.