is_move_constructible和msvc2013

时间:2013-12-28 14:58:16

标签: c++ c++11 move

#include <iostream>
#include <type_traits> 

struct Foo 
{
    Foo(Foo&& f) = delete;
};

int main()
{

    std::cout << std::is_move_constructible<Foo>::value; // output is 1

    std::cin.ignore();
}

在msv2013下,我应该忘记一些内容,还是有错误?

APPENDUM:

#include <iostream>
#include <type_traits> 

struct Foo 
{ 
    ~Foo(){}
};

int main()
{
    std::cout << std::is_move_constructible<Foo>::value;

    std::cin.ignore();
}

即使使用CTP,这个程序产生的输出为1(而c ++标准则相反),而CTP的第一个例子工作正常。

1 个答案:

答案 0 :(得分:5)

是的,一定是个bug。

is_move_constructible是根据is_constructible定义的,它要求具有给定参数的构造格式良好,这显然不是这种情况。

  

[C++11: Table 49]: is_move_constructible<T>

     

is_constructible<T, T&&>::value是真的

  

[C++11: 20.9.4.3/6]:给出以下函数原型:

template <class T>
typename add_rvalue_reference<T>::type create();
     

当且仅当以下变量定义适用于某个发明变量is_constructible<T, Args...>时,才应满足模板特化t的谓词条件:

T t(create<Args>()...);

(下面的说明澄清了create用于避免所有Args的最令人烦恼的解析。)

记录the output is 0 with GCC 4.8


is_*constructible与抽象类appears to have been fixed in mid-2013here's another one相关的类似错误:

  

Microsoft于18/09/2013发表于13:17嗨,

     

感谢您报告此错误。我们已修复它,修复程序在VS 2013 RC中可用。

     

事实上,我们已经彻底改进,修复了所有已知错误。你可以在这里阅读更多相关信息:   http://blogs.msdn.com/b/vcblog/archive/2013/06/28/c-11-14-stl-features-fixes-and-breaking-changes-in-vs-2013.aspx

     Stephan T. Lavavej   高级开发人员 - Visual C ++库   stl@microsoft.com

该链接背后的更改日志包括以下修复:

  

is_constructible类型特征的行为与引用行为不正确(DevDiv#517460)

所以,请再次参加MSVS 2013年11月的CTP。

更新:我被告知11月CTP修复了 。感谢Andy Prowl进行测试。