не поможет?
Попробуйте этим воспользоваться как-то и покажите, что получилось.
Это поможеть ну только не в данной случае
#include <iostream> void foo(const std::string& some) { std::cout << "copy((" << std::endl; } void foo(std::string&& some) { std::cout << "i hate copies!!!" << std::endl; } int main() { foo("abc"); } Вызвался второй экземпляр, Apple clang++ 14.0.3, arm64-apple-darwin22.5.0
Разумеется, но это потому, что доступные foo() означают, что в действительности там произошло foo(std::string{"abc"}); И уже для prvalue std::string произошла материализация объекта (преобразование к xvalue с т.з. категорий значений), lifetime-extension и, наконец, инициализация правой ссылки. std::move("abc") на это бы никак не повлиял: std::string все равно скопирует "abc" в свое владение. Копий самой строки (объекта std::string) там нет ни в одном из случаев, а копия содержимого массива есть безальтернативно.
Если мне нужна std::string в функции(экземпляр, не указатель), то такое действие позволит мне сэкономить на одном новом создании std::string, а если массив чаров, то сэкономить не смогу никак, правильно понимаю?
Почему в первом случае не скопируется объект строки?
Современный порядок инициализации спроектирован так, чтобы предотвратить возникновение избыточных копий. struct S { S ( auto const& ); }; void f ( S ); /* ... */ f(S{"abc"}) /* #1 */; f("abc") /* #2 */; То что в #1 записано выражение S{"abc"}, или то, что оно подразумевается в #2 на месте "abc", не означает, что это приведет к созданию объекта. В действительности это просто синтаксическая единица, инициализатор: prvalue, целевым объектом для которого является тот, что находится под параметром на вызываемой стороне. Он и будет создан и инициализирован: все промежуточные копии избыточны и не возникают.
Большое спасибо за объяснение
Обсуждают сегодня