Для приведенного ниже программного кода мне нужно написать тот же код внутри пары функций-членов, которые получают ссылки на rvalue и lvalue.
Моя цель - использовать только один из пары (например, использовать только те, которые принимают rvalue), а остальные. Прочитал ссылку std::forward
, насколько я понял, похоже она для этого и предназначена. Но когда я удаляю ссылки на lvalue, я получаю следующую ошибку компилятора.
'TestClass::TestClass(const TestClass &)': невозможно преобразовать аргумент 1 из 'std::wstring' в 'std::wstring &&'
Как предотвратить дублирование кода?
#include <iostream>
#include <string>
class TestClass
{
public:
TestClass(const std::wstring & Text)
: Text(Text)
{
std::wcout << L"LValue Constructor : " << Text << std::endl;
/*Some code here...*/
}
TestClass( std::wstring && Text)
: Text(std::forward<std::wstring>(Text))
{
std::wcout << L"RValue Constructor : " << this->Text << std::endl;
/*Same code here...*/
}
TestClass(const TestClass & Another)
: Text(Another.Text)
{
std::wcout << L"Copy Constructor : " << Text << std::endl;
/*Some code here...*/
}
TestClass( TestClass && Another)
: Text(std::forward<std::wstring>(Another.Text))
{
std::wcout << L"Move Constructor : " << Text << std::endl;
/*Same code here...*/
}
private:
std::wstring Text;
};
int wmain(int argc, wchar_t *argv[], wchar_t *envp[])
{
std::wstring Argument(L"Testing Copy");
TestClass Class1Copy(Argument);
TestClass Class1Move(L"Testing Move");
TestClass Class2Copy(Class1Copy);
TestClass Class2Move(std::move(Class1Move));
_wsystem(L"pause");
return 0;
}
Выход:
LValue Constructor : Testing Copy
RValue Constructor : Testing Move
Copy Constructor : Testing Copy
Move Constructor : Testing Move
Press any key to continue . . .
Text(std::forward<std::wstring>(Text))
на самом деле должно бытьText(std::move(Text))
. То же самое и в других местах, где вы использовалиforward
вместоmove
. - person Simple   schedule 08.12.2015