cap*_*500 6 c++ type-traits move-semantics c++11
根据 cppreference,从不可移动的类派生也应该使派生类不可移动。那么为什么std::is_move_constructible_v派生类会返回true呢?
class NonMovable{
public:
NonMovable(const NonMovable&) = default;
NonMovable(NonMovable&&) = delete;
NonMovable& operator = (const NonMovable&) = default;
NonMovable& operator = (NonMovable&&) = delete;
NonMovable() = default;
};
class Derived : public NonMovable{};
int main(){
std::cout << std::is_move_constructible_v<NonMovable> << "\n"; // 0
std::cout << std::is_move_constructible_v<Derived> << "\n"; // 1
}
Run Code Online (Sandbox Code Playgroud)
关键条款如下:
\n\n\n复制/移动构造函数 [class.copy.ctor]
\n...
\n定义为已删除的默认移动构造函数将被重载解析忽略。\n [ 注意:删除的移动构造函数\n否则会干扰可以使用复制构造函数的右值的初始化。\xe2\x80\x94 尾注]
\n
强调我的。删除的移动构造函数只是从重载决策中排除,并且派生类的构造函数最终选择基类的复制构造函数而不是移动构造函数。
\n