最新的intel C ++编译器是14.0.1.139或者是intel parallel studio xe 2013 sp1 update 1.我想知道它是否支持隐式移动构造函数和移动赋值。我测试了下面的代码,它似乎不起作用。
相关文章是here(搜索移动构造函数)。它表示支持。但我无法做到。
#include <memory>
#include <iostream>
#include <algorithm>
using namespace std;
class A
{
public:
unique_ptr<int> m;
};
int main()
{
A a;
A b(std::move(a));
}
在Windows上编译
icl main.cpp /Qstd=c++11
错误
main.cpp
main.cpp(10): error #373: "std::unique_ptr<_Ty, _Dx>::unique_ptr(const
std::unique_ptr<_Ty, _Dx>::_Myt &) [with _Ty=int, _Dx=std::default_delete<int>]"
(declared at line 1447 of "C:\Program Files (x86)\Microsoft Visual Studio
11.0\VC\include\memory") is inaccessible unique_ptr<int> m;
^
detected during implicit generation of "A::A(const A &)" at line 16
compilation aborted for main.cpp (code 2)
主要功能A b(std::move(a));
中的第二行基本上是寻找除移动构造函数A::A(const A &)
之外的复制构造函数A::A(const A &&)
。当没有生成隐式移动构造函数时,这是很常见的。但是编译器说它支持隐式移动构造函数。我很迷惑。感谢。
答案 0 :(得分:2)
答案1:
在Windows环境中使用带有Visual的英特尔C ++编译器 Studio 2010 *或2012 *,Visual C ++支持的C ++ 11功能 默认情况下启用2010/2012。使用“/ Qstd = c ++ 11”打开 支持所有其他案件。在Linux或Mac OS X环境中使用 “-std = C ++ 11”。
来自http://software.intel.com/en-us/articles/c0x-features-supported-by-intel-c-compiler
答案2(由于缺乏信息而猜测):
如果设置了标记,则必须包含<algorithm>
,其中std::move
已定义。
答案3: 您的更新代码可以很好地与GCC和Clang编译。也许您必须明确定义移动构造函数:
#include <memory>
#include <iostream>
#include <algorithm>
using namespace std;
class A
{
public:
// default constructor
A()
{}
// move constructor
A(A&& rhs)
: m(std::move(rhs.m))
{}
unique_ptr<int> m;
};
int main()
{
A a;
A b(std::move(a));
}