gpt4 book ai didi

c++ - VC++ 2010 中的 "moveable-only types"问题

转载 作者:可可西里 更新时间:2023-11-01 15:52:55 25 4
gpt4 key购买 nike

我最近安装了 Visual Studio 2010 Professional RC 来试用它并测试在 VC++ 2010 中实现的几个 C++0x 功能。

我实例化了 std::unique_ptrstd::vector,没有任何问题。但是,当我尝试通过将临时对象传递给 push_back 来填充它时,编译器会提示 unique_ptr 的复制构造函数是私有(private)的。我尝试通过移动它来插入一个左值,它工作得很好。

#include <utility>
#include <vector>

int main()
{
typedef std::unique_ptr<int> int_ptr;

int_ptr pi(new int(1));

std::vector<int_ptr> vec;

vec.push_back(std::move(pi)); // OK
vec.push_back(int_ptr(new int(2))); // compiler error
}

事实证明,问题既不是 unique_ptr 也不是 vector::push_back 而是 VC++ 在处理右值时解决重载的方式,如下面的代码所示:

struct MoveOnly
{
MoveOnly() {}
MoveOnly(MoveOnly && other) {}

private:

MoveOnly(const MoveOnly & other);
};

void acceptRValue(MoveOnly && mo) {}

int main()
{
acceptRValue(MoveOnly()); // Compiler error
}

编译器提示复制构造函数不可访问。如果我公开它,程序就会编译(即使未定义复制构造函数)。

我是不是对右值引用有什么误解,或者它是 VC++ 2010 实现此功能时的一个(可能已知的)错误?

最佳答案

不幸的是,/Za 有问题。它在不应该的时候执行省略复制构造函数可访问性检查(绑定(bind)右值引用不会调用复制构造函数,即使在理论上也是如此)。因此,不应使用/Za。

Stephan T. Lavavej,Visual C++ 库开发人员 (STL@microsoft.com)

关于c++ - VC++ 2010 中的 "moveable-only types"问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2681959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com