首页 > 解决方案 > 显式选择复制分配

问题描述

在 C++11 中,如果复制和移动赋值都可用,如果参数是左值,编译器会自动选择复制赋值,如果是右值,编译器会自动选择移动赋值。使用std::move它可以显式地选择左值的移动分配。但是怎么可能明确地选择右值的复制分配呢?

代码示例:

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

标签: c++c++11

解决方案


一种可能的方法是编写自己copy的将对象绑定到左值引用:

template <class T>
constexpr T& copy(T&& t) noexcept
{
    return t;
}

你可以这样测试它:

test = copy(a);
test = copy(3);
test = copy(std::move(a));

你可以把这个函数放在你自己的命名空间中以保持干净。您也可以为它选择一个更好的名称。


为了解决对终身问题的恐惧,这里有一些注意事项:

  • copy函数接受一个引用并立即返回相同的引用。这意味着调用者负责控制生命周期。
  • 临时对象的生命周期一直持续到语句结束。这使得对象持续足够长的时间以传递到=.

推荐阅读