为什么 std::is_assignable 不适用于基本类型? (确认)

Why std::is_assignable doesn't work with primitive types? (Confirmation)

更具体的原因 std::is_assignable_v<int, int> << '\n'; returns false?是因为 int 没有重载的赋值运算符(是原始类型和所有类型)吗?

(顺便说一下,std::is_trivially_assignable_v<int, int> 也给出了 false。)

请注意: struct Structure {}; std::is_assignable<class Structure, class Structure>::value; 会 return true,因为为 Structure 隐式定义了重载赋值运算符。

到目前为止,我是否正确?如果是这样,那么我想增强 is_assignable 以接受原始类型也不是一件容易的事吗?否则,对于这种可能的解决方法有什么提示吗?

无法将 int 分配给 int。如果您将 int& 作为第一个参数传递,那么,正如预期的那样,is_assignableis_trivially_assignable return true.

cppreference, godbolted

#include <type_traits>

int main()
{
    static_assert(!std::is_assignable_v<int, int>);
    static_assert(std::is_assignable_v<int&, int>);
    static_assert(!std::is_trivially_assignable_v<int, int>);
    static_assert(std::is_trivially_assignable_v<int&, int>);

    return 0;
}

一个不太直观的部分 — is_assignable_v<mytype, mytype> 是真的,因为 mytype{} = mytype{}; 也有效,只有 is_assignable_v<mytype const, mytype> 是假的。

If the expression std::declval<T>() = std::declval<U>() is well-formed in unevaluated context

std::is_assignable<int, int>::value << '\n' // 1 = 1; wouldn't compile

https://en.cppreference.com/w/cpp/types/is_assignable