为什么std :: is_assignable反直觉?

Thr*_*Bit 12 c++ type-traits c++11

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真正的意思?

相关讨论:

How*_*ant 21

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

对于许多用户定义的类型T,分配rvalue类型是完全合理的.它在某些情况下甚至非常有用:

std::vector<bool> v(5);
v[0] = true;
Run Code Online (Sandbox Code Playgroud)

在上面的表达式中,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();
}
Run Code Online (Sandbox Code Playgroud)

上面,结果do_something()被分配给右值std::tuple.分配给rvalues是有用的,甚至是常见的,尽管在绝大多数赋值使用中都没有.

因此std::is_assignable允许确定能够分配到右值和左值的区别.如果您需要了解其中的差异,std::is_assignable可以为您完成工作.

如果您正在处理更常见的情况,例如只是试图弄清楚某个类型T是否可以复制,那么请使用is_copy_assignable<T>.这个特征实际上是根据is_assignable并强制lhs到左值来定义的:

is_copy_assignable<T> == is_assignable<T&, const T&>
Run Code Online (Sandbox Code Playgroud)

所以std::is_copy_assignable<int>::value将如预期的那样真实.

使用is_copy_assignable作为您的首选,或者is_move_assignable您也需要.只有当这些特征不适合你时(可能是因为你需要查看异构分配),你是否应该is_assignable直接使用它们.然后你需要处理你是否想在lhs上允许rvalues的问题,以便考虑可能涉及一个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");
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*han 7

std::is_assignable<int, int>::value == false表示" int文字不能分配给int文字"(除其他外).

你的陈述int x = 3std::is_assignable<int&, int>::value.

欲了解更多信息:http: //en.cppreference.com/w/cpp/types/is_assignable