【发布时间】:2017-07-31 12:28:01
【问题描述】:
我在 Visual Studio 2013 的项目中为我的 std::array 中的元素实现移动构造函数时遇到了一些问题。
所以我尝试在我用 g++ 5.3.0 编译的 notepad++ 中制作一个最小的示例。
只是发现在 g++ 中我可以做我正在尝试的事情
示例 g++:
#include <iostream>
#include <array>
using namespace std;
struct A{
A() = default;
A(const A&)
{
cout << "copy constructed" << endl;
}
A(A&&)
{
cout << "move constructed" << endl;
}
};
class B{
public:
B(array<A, 2>&& a)
: m_a(std::move(a))
{}
private:
array<A, 2> m_a;
};
int main(){
A foo;
cout << "=========1===========" << endl;
array<A, 2> a = { { foo, std::move(foo) } };
cout << "=========2===========" << endl;
B b(std::move(a));
cout << "=========3===========" << endl;
array<A, 2> a_second = std::move(a);
return 0;
}
输出:
=========1============
复制构造
移动构造
=========2============
移动构造
移动构造
=========3============
移动构造
移动构造
当我在 Visual Studio 2013 中尝试(实际上)相同的代码时,结果不同:
输出:
=========1============
复制构造
移动构造
=========2============
复制构造
复制构造
=========3============
复制构造
复制构造
在visual c++中如何使用move构造函数,为什么visual c++在这里拒绝使用他?
【问题讨论】:
-
OT,由于不必要的
stdafx.h和_tmain,您真的需要发布两个代码示例吗? -
[Off Topic]
B(array<A, 2>& a) : m_a(std::move(a))不是您想要将某些东西移动到对象中的方式。您将对象留在调用站点中,而没有任何迹象表明它是移动的。 -
@LogicStuff 我想表明我没有做任何不同的事情。
-
@NathanOliver 我会编辑一个更好的版本,我循环了很多构造函数来找到可以工作的东西这是最新的,但确实不是一个好的界面。
-
@turoni -- 我没有反对
std::;这是使用标准库中的东西的正确方法。而'\n'不 和std::endl做同样的事情;它做的更少——它开始新的一行。 (这是一个提示:阅读std::endl的实际作用并决定是否需要它)
标签: c++ c++11 visual-studio-2013