#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的第一个例子工作正常。
答案 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-2013和here'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进行测试。