std::exchange
может использоваться для реализации конструкторов перемещения. Вот пример из cppreference.com https://en.cppreference.com/w/cpp/utility/exchange#Notes.
Однако возможное значение std::exchange
выглядит следующим образом:
template<class T, class U = T>
T exchange(T& obj, U&& new_value)
{
T old_value = std::move(obj);
obj = std::forward<U>(new_value);
return old_value; // can be copy (until C++17) or a move (C++17), right?
}
Теперь моя ситуация:
#include <string>
#include <utility>
struct MyClass
{
std::string m_str;
// some other non-primitive members of the class
MyClass(MyClass&& other) : m_str{ std::exchange(other.m_str, {}) } // enough?
// or
// : m_str{ std::move(std::exchange(other.m_str, {})) }
// ^^^^^^^^^^ do i need to move?
{}
MyClass& operator=(MyClass&& other)
{
this->m_str = std::exchange(other.m_str, {}); // enough?
// or
// this->m_str = std::move( std::exchange(other.m_str, {}) );
// ^^^^^^^^^^ do I need to move?
return *this;
}
};
Как я прокомментировал код, есть возможность для перемещения или копирования по строкам
m_str{ std::exchange(other.m_str, {}) }
this->m_str = std::exchange(other.m_str, nullptr);
Следовательно,
- следует явно использовать
std::move
дляих, так что я могу убедиться, что члены были на 100% перемещены в объект other
? - Если Да , будет ли более громоздким использование
std::exchange
для этогосценарий?
Я использую Visual Studio 2017 с флагом компилятора C ++ 14.