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

Why std::is_assignable doesn't work with primitive types? (Confirmation)

提问人:KeyC0de 提问时间:9/21/2018 更新时间:9/21/2018 访问量:755

问:

更具体地说,为什么要退货?是因为 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;trueStructure

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

C++ assign assignment-operator 重载

评论

1赞 NathanOliver 9/21/2018
您可以检查类型或is_fundementalis_assignable
0赞 n. m. could be an AI 9/21/2018
您的示例将在 en.cppreference.com/w/cpp/types/is_assignable 上讨论

答:

9赞 bobah 9/21/2018 #1

不能将 An 分配给 .如果改为作为第一个参数传递,则如预期的那样,both 和 return .intintint&is_assignableis_trivially_assignabletrue

cpp首选项godbolted

#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

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