最新的intel c ++编译器是否支持隐式移动构造函数和移动赋值?

时间:2013-12-13 07:01:13

标签: c++ c++11 icc

最新的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 &&)。当没有生成隐式移动构造函数时,这是很常见的。但是编译器说它支持隐式移动构造函数。我很迷惑。感谢。

1 个答案:

答案 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));
}