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)
std::is_assignable<int, int>::value == false表示" int文字不能分配给int文字"(除其他外).
你的陈述int x = 3是std::is_assignable<int&, int>::value.
欲了解更多信息:http: //en.cppreference.com/w/cpp/types/is_assignable
| 归档时间: |
|
| 查看次数: |
1325 次 |
| 最近记录: |