我不明白为什么只有移动模板不能通过具有 a static_assert
(如下面的代码)的 copy-ctor 来扩展,以便与std::any
#include <any>
#include <cassert>
namespace detail{
template<typename T=int>
struct MoveOnly
{
MoveOnly() = default;
MoveOnly(MoveOnly const&) {static_assert(sizeof(T)!=sizeof(T),"");}
MoveOnly(MoveOnly &&) = default;
MoveOnly &operator=(MoveOnly const&) {static_assert(sizeof(T)!=sizeof(T),"");}
MoveOnly &operator=(MoveOnly &&) = default;
};
}
using MoveOnly = detail::MoveOnly<>;
static_assert(std::is_copy_constructible<MoveOnly>::value,"");
int main() {
MoveOnly a;
//std::any any(std::move(a)); //<- compile error
return 0;
}
在std::any::any它说 ctor #4
此重载仅在 ... std::is_copy_constructible_v<std::decay_t<ValueType>> 为真时参与重载决议。
据我所见std::is_copy_constructible<MoveOnly>::value
,给出了 true 并且永远不会调用 copy-ctor 。那么编译器怎么可能仍然抱怨static_assert
内部的copy-ctor呢?