根据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
}
const T&
参数的复制构造函数的类型,满足std :: is_move_constructible
。 - 273Kis_move_constructible_v<NonMovable>
是false
。 - Nathan Piersonstd::cout << std::is_move_constructible_v<NonMovable> << "\n";
应该是1
,但它显示为0
。 - François AndrieuxNonMovable
情况,移动构造函数被显式删除。显式删除的函数仍然参与重载决议(但如果它最终获胜,你会得到一个编译器错误)。但是在Derived
中,移动构造函数被默认为删除,因此根本不参与(因此无法赢得没有参与的游戏)。 "将已定义为已删除的默认移动特殊成员函数从所有上下文的候选函数集排除。" - Raymond Chen