0

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>::valuetrue が返され、copy-ctor が呼び出されることはありません。static_assertでは、コンパイラが内部の copy-ctorについて不平を言う可能性があるのはどうしてでしょうか?

4

1 に答える 1