明确选择副本分配

时间:2018-06-25 05:58:35

标签: c++ c++11

在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;
}

2 个答案:

答案 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_castconst int&

test = static_cast<const int&>(3);