C++ move和msvc2013是否可施工 #包括 #包括 结构Foo { Foo(Foo&&f)=删除; }; int main() { std::cout

C++ move和msvc2013是否可施工 #包括 #包括 结构Foo { Foo(Foo&&f)=删除; }; int main() { std::cout,c++,c++11,move,C++,C++11,Move,是的,一定是个bug。 is\u move\u constructible是根据is\u constructible定义的,这要求具有给定参数的构造是格式良好的,这里显然不是这样 [C++11:表49]:是可构造的 是可构造的::value是真的 [C++11:20.9.4.3/6]:给定以下函数原型: #include <iostream> #include <type_traits> struct Foo { ~Foo(){} }; int mai

是的,一定是个bug。

is\u move\u constructible
是根据
is\u constructible
定义的,这要求具有给定参数的构造是格式良好的,这里显然不是这样

[C++11:表49]:
是可构造的

是可构造的::value
是真的

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

#include <iostream>
#include <type_traits> 

struct Foo 
{ 
    ~Foo(){}
};

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

    std::cin.ignore();
}
(下面的一个注释阐明了这里使用的
create
是为了避免对所有
Args
进行最麻烦的解析)

记录在案


类似的bug是可构造的
与抽象类有关,并且:

微软于2013年9月18日13:17发布

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

事实上,我们已经进行了全面检查,修复了所有已知的bug。您可以在此处了解更多信息:

斯蒂芬·拉瓦维
高级开发人员——Visual C++库 stl@microsoft.com

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

类型特征的is#u可构造家族与参考不正确(DevDiv#517460)

所以,在MSVS 2013年11月的CTP中再次尝试一下


更新:我听说这在11月份的CTP中已修复。感谢您的测试。

抱歉,我提供了错误的信息(项目设置混乱)。它似乎在2013年11月的CTP中得到了修复。@Guillaume07:确实没有。CTP修复了这个问题。@Guillaume07:实际上,它返回
true
的原因是存在一个隐式生成的复制构造函数,并且一个可复制构造函数类也是可移动构造的。现在,隐式生成复制构造函数只是不推荐的ted,不是非法的(因为向后兼容)尝试删除复制构造函数:
std::is\u move\u constructible::value
应该会产生
false
@Guillaume07:这是我认为标准很容易误导的领域之一。
MoveConstructible
概念意味着你应该能够构造对象from是一个右值。
CopyConstructible
概念意味着您应该能够从左值构造对象。现在,既然复制构造函数通过
const&
接受其参数(让我们忘记不接受的奇怪复制构造函数),您可以向它传递一个右值。您将获得一个副本,但这使类
可移动
@Guillaume07:另一种考虑它的方式是状态传播。复制是一种将状态从对象X传播到对象Y的方式,以便(1)对象Y采用对象X的状态,以及(2)对象X保留其状态。复制后,两个对象具有相同的状态。移动是一种传播状态的方式,只需要(1),这使得它更通用。这就是为什么
CopyConstructible
MoveConstructible
的一种特殊化,而不是相反。这种“移动”的概念与“移动”的概念冲突作为“调用移动构造函数”,标准没有消除歧义。@Mgetz:
#include <iostream>
#include <type_traits> 

struct Foo 
{ 
    ~Foo(){}
};

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

    std::cin.ignore();
}
template <class T>
typename add_rvalue_reference<T>::type create();
T t(create<Args>()...);