【问题标题】:Why std::is_assignable doesn't work with primitive types? (Confirmation)为什么 std::is_assignable 不适用于原始类型? (确认)
【发布时间】:2019-02-25 00:27:15
【问题描述】:

更具体的原因 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 以接受原始类型也不是一件容易的事吗?否则,对这种可能的解决方法有任何提示吗?

【问题讨论】:

标签: c++ assign assignment-operator overloading


【解决方案1】:

int 不能分配给 int。如果您将int&amp; 作为第一个参数传递,那么正如预期的那样,is_assignableis_trivially_assignable 都返回true

cppreference, 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&lt;mytype, mytype&gt; 为真是因为mytype{} = mytype{}; 也有效,只有is_assignable_v&lt;mytype const, mytype&gt; 为假。

【讨论】:

  • 我不明白为什么 int 不能被 int 赋值,你能解释一下吗?
  • @Jeka,我猜是因为你不能说int{42} = int{24}(错误:临时作为左值),但你可以说mytype{42} = mytype{24}(好问题,为什么?)。 is_assignable 所做的只是检查赋值表达式是否格式正确。
  • @Jeka 他的意思是在 std::declval 的上下文中(由 std::is_assignable 内部使用),它返回其参数的右值引用(仅编译时未评估的上下文)。正如 bobah 解释的那样,您不能分配给右值。一旦我在那里看到他的措辞,我就知道这会让人们感到困惑。
  • @Nik-Lz - 谢谢你的拼写,我意识到我的评论并不比标准措辞更令人困惑。
【解决方案2】:

如果表达式std::declval&lt;T&gt;() = std::declval&lt;U&gt;() 在未求值的上下文中格式正确

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

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

【讨论】:

    猜你喜欢
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 2014-08-22
    相关资源
    最近更新 更多