通过boost的weak_ptr的1.53标题,我惊讶地看到移动赋值和移动构造函数已经实现,即使它们没有记录。 从本文档中 ,没有任何要求std :: weak_ptr提供移动功能。

通过Visual Studio 2012的weak_ptr实现,我没有注意到在weak_ptr中声明了任何明显的移动操作,尽管它们可能隐藏在继承之后。 但是,此代码导致监视窗口报告指针的一个共享引用和两个弱引用,这使我相信weak_ptr未启用移动:

std::shared_ptr<int> ptr(std::make_shared<int>(5));
std::weak_ptr<int> weakptr(ptr);
std::weak_ptr<int> movedWeakPtr(std::move(weakptr));

是否有充分的理由说std :: weak_ptr不提供移动功能? 如果没有,weak_ptr应该被视为可移动类型吗?

===============>>#1 票数:6 已采纳

根据定义 ,每个可复制的类型都是可移动的。 weak_ptr是可复制的,因此它是可移动的。

weak_ptr 可以有一个移动构造函数。 但它只适用于相对较小的优化。 这可能是标准委员会的疏忽。

  ask by masrtis translate from so

未解决问题?本站智能推荐:

3回复

为什么C ++ 11的move构造函数/赋值运算符不按预期运行

我的预期输出应为: 但是,实际输出为:(C ++编译器为:Visual Studio 2012) 这是VC ++的错误吗? 还是只是我的误会?
2回复

移动构造函数问题

我有以下课程: 我这样使用它: 从我所读到的,移动构造函数由编译器自动生成。 现在,当我走进这行students.push_back(std::make_shared<Student>(std::move(stud2))); 我到达移动构造函数,这没关系。
2回复

移动构造函数可以隐含吗?

考虑以下课程: 现在考虑以下复制结构: 尽管缺少显式的复制构造函数,复制构造将充分复制A ,因为std::string的复制构造函数将由编译器生成的隐式复制构造函数调用。 我想知道的是,移动建筑也是如此吗? 编辑 : 这里的测试表明: 实际上会导致复制构造,除
2回复

应该何时编译生成移动构造函数?

我使用VS11并使用以下内容: 我希望这个类生成移动构造函数/赋值。 事实是我没有一个琐碎的构造函数,因为我没有动作吗? 还是有其他因素影响这个?
2回复

使用unique_ptr移动语义

我正在使用Visual Studio 2012 Update 2,并且无法理解为什么std :: vector正在尝试使用unique_ptr的复制构造函数。 我已经看过类似的问题,大多数都与没有明确的移动构造函数和/或运算符有关。 如果我将成员变量更改为字符串,我可以验证是否调用了移动
3回复

与移动构造器配对时发生意外的析构函数调用

以下代码已作为学习练习在Windows Studio的Visual Studio 2012 Express中编译并运行。 在禁用编译器优化功能(/ Od)的情况下进行编译时,结果输出表明析构函数被调用两次。 鉴于仅构造了一个对象,这是一个问题。 为什么析构函数被调用两次? 如果该类
1回复

隐式生成move构造函数

是否可以隐式生成仅移动类的移动构造函数? 考虑一个这样的类: 这不会编译,因为隐式声明的copy构造函数无法复制p_。 (12.8 / 7) 如果类定义未明确声明一个副本构造函数,则将隐式声明一个副本构造函数。 如果类定义声明了move构造函数或move赋值运算符,则隐式
1回复

C ++ 11移动语义和Microsoft Visual C ++编译优化

让我们考虑以下Microsoft Visual C ++中的自定义数组的类模板(Microsoft Visual Studio 2012 RC,版本11.0.50522.1 RCREL)。 请注意,构造函数,析构函数和复制构造函数被定义为不执行任何操作。 普通的打印功能定义如下
2回复

移动使用lambda调用的构造函数

我试图了解lambdas如何在C ++中深入工作。 我写了下面这段代码。 输出如下。 A1 A2 cA22 | cA42 mA52 dA42(cA21 mA31 31 | 52 dA31 dA21)dA52 | dA22 dA2 dA1 除了“mA52”移动构造函
2回复

移动构造函数和char数组参数

我不明白为什么MSVC对Foo f( std::move(v) )不满意? (也许这段代码毫无意义)