【发布时间】:2021-08-25 00:33:53
【问题描述】:
根据 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。 -
这并不能解释为什么
is_move_constructible_v<NonMovable>是false。 -
@S.M.在这种情况下,
std::cout << std::is_move_constructible_v<NonMovable> << "\n";将是1,但它显示0。 -
问题是关于第二种情况。 AFAIK删除的构造函数也不涉及没有构造函数的类。
-
在
NonMovable的情况下,移动构造函数被显式删除。显式删除的函数仍然参与重载决议(但如果它最终获胜,则会出现编译器错误)。但是在Derived中,移动构造函数默认为已删除,因此它根本不参与。 (因此无法赢得它不玩的游戏)。 "A defaulted move special member function that is defined as deleted is excluded from the set of candidate functions in all contexts.
标签: c++ c++11 move-semantics typetraits