gpt4 book ai didi

c++ - 为什么 std::is_assignable 违反直觉?

转载 作者:可可西里 更新时间:2023-11-01 14:55:59 27 4
gpt4 key购买 nike

std::is_assignable<int, int>::value == false在一致的实现中(例如 clang/libc++、gcc/libstdc++,但不是 VS2012)。

直觉上,这意味着像 int x = 3; 这样的表达式是无效的。但是 is_assignable 的规范指出分配的两边都转换为 std::add_rvalue_reference<T>::type ,等等 std::is_assignable<int, int>::value必须评估为 false (因为 int + && -> int&& ,这是一个不可分配的右值)。

为什么是std::is_assignable以这种方式设计,还是我误解了什么is_assignable<int, int>::value真的是什么意思?

相关讨论:

最佳答案

在这些特征中,并具有 T不是左值引用类型,T意味着右值。

具有许多用户定义的类型 T ,分配给右值类型是完全合理的。它甚至在某些情况下非常有用:

std::vector<bool> v(5);
v[0] = true;

在上面的表达式中,v[0]是一个被分配给的右值。如果vector<bool>是一个糟糕的例子,那么下面的新 C++11 代码做同样的事情:

#include <tuple>

std::tuple<int, int>
do_something();

int
main()
{
int i, j;
std::tie(i, j) = do_something();
}

以上,do_something()的结果正在分配给右值 std::tuple .为右值赋值是有用的,甚至是常见的,尽管在大多数赋值用途中都没有这样做。

所以 std::is_assignable允许确定能够分配给右值和左值之间的区别。如果你需要知道区别,std::is_assignable可以为您完成这项工作。

如果您正在处理更常见的情况,例如只是想弄清楚类型 T是否可复制分配,然后使用 is_copy_assignable<T> .这个特征是根据 is_assignable 字面定义的并强制 lhs 为左值:

is_copy_assignable<T> == is_assignable<T&, const T&>

所以 std::is_copy_assignable<int>::value将按预期为真。

使用 is_copy_assignable作为您的首选,或 is_move_assignable如果你也需要的话。只有当这些特征对你不起作用时(可能是因为你需要查看异构作业),你才应该恢复使用 is_assignable直接地。然后您需要处理是否要在 lhs 上允许右值的问题,以便解决可能涉及 vector<bool>::reference 的情况。 , 或 tuple的引用资料。您必须明确选择是否要在 is_assignable 查询中允许此类情况。

例如:

#include <type_traits>
#include <vector>

int
main()
{
static_assert(std::is_assignable<std::vector<bool>::reference&, bool>(),
"Should be able to assign a bool to an lvalue vector<bool>::reference");

static_assert(std::is_assignable<std::vector<bool>::reference, bool>(),
"Should be able to assign a bool to an rvalue vector<bool>::reference");

static_assert(std::is_assignable<bool&, std::vector<bool>::reference>(),
"Should be able to assign a vector<bool>::reference to an lvalue bool");

static_assert(!std::is_assignable<bool, std::vector<bool>::reference>(),
"Should not be able to assign a vector<bool>::reference to an rvalue bool");
}

关于c++ - 为什么 std::is_assignable 违反直觉?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19920213/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com