为何纯虚函数(=0)会抑制std::is_nothrow_move_constructible且导致编译失败?
C++抽象类与移动构造判定问题解答
问题1:为何将虚函数设为纯虚(=0)会抑制std::is_nothrow_move_constructible?
含有纯虚函数的类属于抽象类,抽象类的核心特性是无法被实例化。而std::is_nothrow_move_constructible的判定前提是目标类型必须是可实例化的完整类型,且移动构造操作能保证不抛出异常。对于抽象类,标准库会直接判定其不满足该特性的条件——因为连对象都无法创建,自然不存在有效的移动构造行为可供判定。
问题2:为何代码仅在移除=0时才可编译?
代码中的static_assert要求Foo类型满足noexcept可移动构造的特性。当Foo是抽象类(带有纯虚函数)时,std::is_nothrow_move_constructible<Foo>::value的结果为false,触发断言失败,导致编译终止。
移除=0后,Foo不再是抽象类,成为可实例化的普通类。此时编译器会验证显式指定noexcept = default的移动构造函数确实符合noexcept要求,因此std::is_nothrow_move_constructible<Foo>::value变为true,断言通过,代码可以正常编译。
内容的提问来源于stack exchange,提问作者user541686
相关产品推荐
相关产品推荐

