首页 > 解决方案 > 为什么 std::is_assignable 不适用于原始类型?(确认)

问题描述

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

(顺便也std::is_trivially_assignable_v<int, int>false了。)

请注意, this: struct Structure {}; std::is_assignable<class Structure, class Structure>::value; 将返回true,因为为 隐式定义了重载的赋值运算符Structure

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

标签: c++assignassignment-operatoroverloading

解决方案


int不能将 分配给int。如果您int&改为作为第一个参数传递,那么正如预期的那样,两者is_assignableis_trivially_assignable返回true

cppreference ,天马行空

#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>错误。


推荐阅读