过去,我已经找到了很多与此相关的对话(例如here),但是这种对话是从很早以前开始的。我有一个问题的代码是:
#include <utility>
#include <iostream>
struct Foo
{
Foo() = default;
Foo(const Foo &o)
{
std::cout << "copy" << std::endl;
}
Foo(Foo &&o)
{
std::cout << "move" << std::endl;
}
};
struct Bar
{
Foo foo;
};
int main(void)
{
Bar a;
Bar b(a);
Bar c(std::move(a));
}
如果在Visual Studio 2013(更新3)中执行代码,则这两种情况都将打印出“副本”。如果自从以上链接中的答案以来标准没有更改,则输出应为“复制”,后跟“移动”。Ideone似乎给出了正确的输出。这仅仅是Visual Studio尚未实现的东西,还是我的代码中缺少了什么?我知道您不能将move构造函数标记为default,但这并不意味着编译器不支持一起生成默认的move构造函数。
我知道您不能将move构造函数标记为默认构造函数,但这并不意味着编译器不支持一起生成默认的move构造函数。
不幸的是,这就是这个意思。VS2013不支持隐式生成移动构造函数和移动分配运算符。如果这样做的话,他们实际上就没有理由不接受= default
语法,特别是因为允许您为复制构造函数和赋值运算符这样做。
引用MSDN:支持C ++ 11功能(现代C ++)
“ Rvalue引用v3.0”添加了新规则,以在某些条件下自动生成移动构造函数和移动赋值运算符。但是,由于时间和资源的限制,无法在Visual Studio 2013的Visual C ++中实现此功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句