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>> が true である場合にのみ、オーバーロードの解決に参加します。
私が見る限り、std::is_copy_constructible<MoveOnly>::value
true が返され、copy-ctor が呼び出されることはありません。static_assert
では、コンパイラが内部の copy-ctorについて不平を言う可能性があるのはどうしてでしょうか?