Search code examples
c++assignassignment-operatoroverloading

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


To be more specific why std::is_assignable_v<int, int> << '\n'; returns false? Is it because an int has no overloaded assignment operator (being a primitive type and all)?

(by the way std::is_trivially_assignable_v<int, int> gives false too.)

Note that this: struct Structure {}; std::is_assignable<class Structure, class Structure>::value; would return true, because an overloaded assignment operator is implicitly defined for Structure.

Am i correct so far? If so then I suppose it wouldn't be trivial to enhance is_assignable to accept primitive types as well? Otherwise, any hints for such a possible work-around?


Solution

  • 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