在C ++ 11中,如果复制和移动分配均可用,则编译器将在参数为左值时自动选择复制分配,而在参数为右值时自动选择复制分配。使用std::move
可以为lvalue明确选择移动分配。但是如何显式选择右值的副本分配?
代码示例:
#include <iostream>
class testClass
{
public:
testClass &operator=(const int &other) {
std::cout << "Copy assignment chosen." << std::endl;
return *this;
}
testClass &operator=(int &&other) {
std::cout << "Move assignment chosen." << std::endl;
return *this;
}
};
int main(int argc, char *argv[])
{
int a = 4;
testClass test;
test = a; // Selects copy assignment
test = 3; // Selects move assignment
test = std::move(a); // Selects move assignment
// test = std::copy(3); // <--- This does not work
return 0;
}
答案 0 :(得分:19)
一种可能的方法是编写自己的copy
将对象绑定到左值引用:
template <class T>
constexpr T& copy(T&& t) noexcept
{
return t;
}
您可以通过以下方式进行测试:
test = copy(a);
test = copy(3);
test = copy(std::move(a));
您可以将此函数放在自己的名称空间中,以保持环境整洁。您也可以为其选择一个更好的名称。
要解决一生的问题,请注意以下几点:
copy
函数接受一个引用,并立即返回相同的引用。这意味着调用方负责控制生存期。=
的左侧。答案 1 :(得分:8)
您可以static_cast
至const int&
:
test = static_cast<const int&>(3);