更具体的原因
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
来接受原始类型不是很简单吗?否则,是否有任何暗示暗示这种可能的解决方法?
答案 0 :(得分:6)
不能将int
分配给int
。如果您改为将int&
作为第一个参数传递,则is_assignable
和is_trivially_assignable
都将返回true
。
#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