template <typename InfoType>
class ObjPool {
public:
struct tag;
using size_type = unsigned;
using uid_type = IntWrapper<tag, size_type>;

uid_type add(InfoType&& newInfo) {
    if (removedUids_.size()) {
        uid_type reuse = removedUids_.back();
        removedUids_.pop_back();
        infos_[reuse] = newInfo;  // This line
        alive_[reuse] = true;
        ++size_;
        return reuse;
    }
    else {
        infos_.push_back(newInfo);
        alive_.push_back(true);
        ++size_;
        return uid_type(size_-1);
    }
}

// Other code
};

编译器生成错误:



我不太明白为什么?我定义了一个移动分配,并期望这一行调用移动版本而不是复制版本。

为什么是
infos_[reuse] = std::move(newInfo);
这里有必要吗?

使用c++ 11与clang一起编译。

最佳答案

右值引用类型的命名变量是左值(感谢@ M.M进行更正)。它有一个名称,您可以获取其地址,并且与左值引用几乎相同。由于右值引用只能绑定(bind)到右值,所以移动分配运算符不能采用(命名的)右值引用。调用std::move将使其成为右值(特别是xvalue),以便将其传递给move运算符。

cppreference:

08-16 09:31