为什么 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_assignable
和 is_trivially_assignable
return 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>
是假的。
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
更具体的原因
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_assignable
和 is_trivially_assignable
return 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>
是假的。
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