У меня есть этот пример:Почему не был вызван конструктор std :: string move?
#include <string>
#include <iostream>
class Test {
private:
std::string str;
public:
Test(std::string &&str_) :
str(str_)
{}
const std::string &GetStr()
{
return str;
}
};
int main(int argc, char *argv[])
{
std::string there("1234567890");
std::cout << "1. there: " << there << '\n';
Test t1(std::move(there));
std::cout << "2. there: " << there << '\n';
std::cout << "3. there: " << t1.GetStr() << '\n';
}
Это дает выходной сигнал
$ ./a.out
1. there: 1234567890
2. there: 1234567890
3. there: 1234567890
Это использование GCC 5.1.1 на Linux. В то время как строка there
остается в правильном, но неопределенном состоянии после перемещения, эта реализация, похоже, перемещает (а не копирует) строку, если вызывается конструктор перемещения std :: string.
, если я заменю initalizer str(str_)
с str(std::move(str_))
я получаю этот выход:
$ ./a.out
1. there: 1234567890
2. there:
3. there: 1234567890
Это наводит на мысль двигаться конструктор станд :: строка теперь используется, но почему не std::string(std::string &&)
вызывается в моем первом примере?