В книге The C++ Programming Language приведен пример использования операций по умолчанию. Мой вопрос фокусируется на операции перемещения по умолчанию.По умолчанию движение строительства
struct S {
std::string a;
int b;
};
S f(S arg) {
S s0{};
S s1(s0); //s1 {s0}; in the book
s1 = arg;
return s1;
}
После этого он говорит:
Копия строительство s1 копий s0.a и s0.b. Возврат s1 перемещает s1.a и s1.b, оставляя s1.a в качестве пустой строки и s1.b без изменений. Обратите внимание, что значение перемещенного объекта встроенного типа не изменяется. Это самая простая и самая быстрая задача для компилятора.
Я думаю, что это означает, что, если я пишу:
S s3{"tool",42};
f(s3);
Поскольку значение s1 перемещается, s1.a будет вернуться к «» и s1.b не меняется? Затем, когда f() завершает выполнение, s1 будет уничтожен? Я пытаюсь найти способ проверить свою догадку, но я не могу найти способ узнать значения s1 после выполнения функции, потому что это, конечно, локально. Я написал деструктор только для того, чтобы найти ценности, прежде чем они будут уничтожены.
~S() {
std::cout << a << " " << b << '\n';
}
Выходы:
0 //values of s0?
tool 42
tool 42
tool 42
Кажется, я думаю, совершенно неправильно, и я совершенно не понимаю текст. Может ли кто-нибудь объяснить текст в ясности цитаты?
Вы можете видеть оптимизации малого строки (которая изменит путь перемещенных-из строки выглядит так), IIRC, 'станд :: string' по-прежнему не соответствует требованиям GCC 4.9. –