相关疑难解决方法(0)

理解`std :: is_move_constructible`

没有移动构造函数但带有接受const T&参数的复制构造函数的类型满足std::is_move_constructible.例如,在以下代码中:

#include <type_traits>

struct T {
    T(const T&) {}
    //T(T&&) = delete;
};

int main() {
    static_assert(std::is_move_constructible<T>::value, "not move constructible");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

T 将没有隐式移动构造函数,因为它具有用户定义的复制构造函数.

但是,如果我们取消注释移动构造函数的显式删除,则代码不再编译.为什么是这样?我原以为显式复制构造函数仍然会满足std::is_move_constructible.

重载是否起作用,选择声明的移动构造函数然后失败,因为它被删除了?


如果a no implicit move ctor和deleted move ctorclass 之间的移动构造性之间的差异是由标准规定的,请引用,并且如果可能的话,给出一个基本原理(例如"提供禁止移动构造的设施" - 首先想到的事情).

c++ move-constructor c++11

14
推荐指数
2
解决办法
1794
查看次数

为什么隐式和显式删除移动构造函数的处理方式不同?

关于隐式生成包含/继承类的移动构造函数,C++ 11标准中隐式和显式删除的移动构造函数的不同处理背后的基本原理是什么?

C++ 14/C++ 17有什么改变吗?(C++ 14中的DR1402除外)

注意:我理解发生了什么,我理解它是根据C++ 11标准的规则,我对这些规则的理由感兴趣,这意味着这种行为(请确保不要简单地重申它是这样的方式这是因为标准说的是这样).


假设一个类ExplicitDelete具有明确删除的移动ctor和明确默认的复制ctor.move constructible即使兼容的拷贝ctor可用,这个类也是不可用的,因为重载决策选择了移动构造函数,并且由于删除而在编译时失败.

假设一个ImplicitDelete包含或继承的类,ExplicitDelete不执行任何其他操作.由于C++ 11移动ctor规则,此类将其ctor隐式声明为已删除.但是,这个课程仍将move constructible通过其复制ctor.(这最后的陈述是否与DR1402的解决方案有关?)

然后,Implicit包含/继承的类ImplicitDelete将生成一个完全精细的隐式移动构造函数,该构造函数调用ImplicitDelete复制ctor.

那么允许Implicit能够隐式移动而ImplicitDelete不能隐式移动的理由是什么呢?

在实践中,如果Implicit并且ImplicitDelete有一些重型的可移动成员(想想vector<string>),我认为没有理由Implicit比ImplicitDelete移动性能更优越.ImplicitDelete仍然可以复制ExplicitDelete其隐含的动作ctor-就像Implicit它一样ImplicitDelete.


对我来说,这种行为似乎不一致.如果发生以下两种情况之一,我会发现它更加一致:

  1. 编译器同时处理隐式和显式删除的移动ctors:

    • ImplicitDelete变得不move-constructible,就像ExplicitDelete
    • ImplicitDelete的删除的举动男星导致删除的隐含移动构造函数Implicit(在以同样的方式ExplicitDelete做,为ImplicitDelete …

c++ move-semantics c++11

11
推荐指数
1
解决办法
673
查看次数

标签 统计

c++ ×2

c++11 ×2

move-constructor ×1

move-semantics ×1