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

时间:2018-09-20 16:23:57

标签: c++ assign assignment-operator overloading

更具体的原因 std::is_assignable_v<int, int> << '\n'; 返回false?是因为int没有重载的赋值运算符(既是原始类型又是全部)?

(通过std::is_trivially_assignable_v<int, int>给出false的方式。)

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

我到目前为止是否正确?如果是这样的话,我想增强is_assignable来接受原始类型不是很简单吗?否则,是否有任何暗示暗示这种可能的解决方法?

2 个答案:

答案 0 :(得分:6)

不能将int分配给int。如果您改为将int&作为第一个参数传递,则is_assignableis_trivially_assignable都将返回true

cppreferencegodbolted

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

答案 1 :(得分:3)

  

如果表达式std::declval<T>() = std::declval<U>()在未计算的上下文中格式正确

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

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