提问人:KeyC0de 提问时间:9/21/2018 更新时间:9/21/2018 访问量:755
为什么 std::is_assignable 不适用于基元类型?(确认)
Why std::is_assignable doesn't work with primitive types? (Confirmation)
问:
更具体地说,为什么要退货?是因为 int 没有重载赋值运算符(是原始类型和 all)吗?std::is_assignable_v<int, int> << '\n';
false
(顺便说一句,也给。std::is_trivially_assignable_v<int, int>
false
请注意,this: 将返回 ,因为 隐式定义了重载赋值运算符。struct Structure {};
std::is_assignable<class Structure, class Structure>::value;
true
Structure
到目前为止我是对的吗?如果是这样,那么我想增强接受原始类型也不是一件容易的事吗?否则,对于这种可能的解决方法,有什么提示吗?is_assignable
答:
9赞
bobah
9/21/2018
#1
不能将 An 分配给 .如果改为作为第一个参数传递,则如预期的那样,both 和 return .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>
评论
2赞
Jeka
9/21/2018
我不明白为什么 int 不能被 int 分配,你能解释更多吗?
0赞
bobah
9/21/2018
@Jeka,我猜是因为你不能说(错误:暂时作为左值),但你可以说(好问题,为什么?所有要做的就是检查赋值表达式的格式是否正确。int{42} = int{24}
mytype{42} = mytype{24}
is_assignable
1赞
KeyC0de
9/21/2018
@Jeka 他的意思是在上下文中(由 std::is_assignable 内部使用),它返回其参数的右值引用(仅限编译时未计算的上下文)。正如 bobah 所解释的,你不能赋值给右值。一旦我看到他的措辞,我就知道这会让人感到困惑。std::declval
0赞
bobah
9/21/2018
@Nik-Lz - 感谢您的拼写,我意识到我的评论并不比 std 措辞更令人困惑。
5赞
dan
9/21/2018
#2
如果表达式在未计算的上下文中格式正确
std::declval<T>() = std::declval<U>()
std::is_assignable<int, int>::value << '\n' // 1 = 1; wouldn't compile
评论
is_fundemental
is_assignable