- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
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/
出现以下错误: INSERT INTO GroupMembers VALUES ('Goldfrat', 'Simon Palm') * ERROR at line 1: ORA-02291: int
据称以下代码违反了 OO 指导原则。 public class Main { public static String NAME = "James"; public Main() {
我创建了一个名为 EvenementBean 的 EJB 2 进行测试。然后我就把它删除了。现在每当尝试部署我的 .ear 项目时,我都会收到以下错误: WARN [verifier] EJB
我正在开发的一个应用程序正在使用 Oracle 和 Hibernate 作为 ORM。当我尝试插入 PartyUserObject 时,我不断收到以下错误: could not insert: [Pe
我已经实现了一些代码行: if(condition){ Class a = new Class(); method(a.b(), a.c()); }else{ method(null, n
这个问题在这里已经有了答案: Static analysis of noexcept "violations" in C++ (2 个答案) 关闭 4 年前。 我大量使用 noexcept,不幸的是
我有一个 MVVM 应用程序,在我的几个 VM 中,我使用 CollectionViewSource.GetDefaultView(datasource) 来初始化我的 ICollectionView
当我尝试运行我的网站时,它显示 500 internal server error : Internal Server Error The server encountered an internal
运行生存分析,假设变量的 p 值具有统计显着性 - 假设与结果呈正相关。但是,根据 Schoenfeld 残差,违反了比例风险 (PH) 假设。 在纠正 PH 违规后,以下哪种情况可能发生? p 值可
我知道以下是一个主观问题,但您的指导方针确实有助于我追求干净、可测试的代码。 请考虑以下示例,我认为它违反了一系列设计原则。 public class OfferEligibilityCheckerS
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭10 年前。 Improv
当我尝试将 Paho MQTT javacrript 与 Mosquito MQTT websockets 一起使用时,只要我用来服务页面的 Web 服务器和 Mosquito 位于同一服务器(同一来
我在通过 hibernate 映射 oracle 时遇到问题 我有这些类(class) Stock.java package com.mc.stock; import java.uti
在我的项目中,我试图解决 Sonar 违规问题,我坚持使用这个,我有以下代码 不允许使用以下属性:语言 谁能告诉我如何解决这个 Sonar 违规问题?我可以简单地删除这种“语言”吗属性还是我应该输
我正在尝试记录唯一标识符,所以我无法承受重复记录我的 ID 当我尝试更新名为 Clients 的 SQL Server 表时,我收到类似这样的错误。 Violation of PRIMARY KEY
我正在尝试实现一个解决方案,以在给定的整数列表中找到第 k 个最大的元素,其中重复项具有 O(N*log(N)) Big-O 表示法的平均时间复杂度,其中 N 是列表中元素的数量。 根据我的理解,合并
如果 tuple_size 模板是一个完整的类型,结构化绑定(bind)特性表示它会像分解一样与元组一起使用。当 std::tuple_size 在程序的某一点是给定类型的完整类型而在另一点不完整时会
我们的应用目前已从 google play 中删除,因为它具有 SMS 权限。我们已经删除了权限并上传了一个新的 apk,但项目的状态仍然是删除。我们是否必须等待他们审核,或者是否需要任何其他必要的步
*i 和 u.i 如何在此代码中打印不同的数字,即使 i 被定义为 int *i = &u.i;?我只能假设我在这里触发了 UB,但我看不出具体情况。 ( 如果我选择“C”作为语言,ideone de
您好,我正在 Oracle SQL dev 中开发一个数据库,它试图从另一个表访问外键。我目前正在处理使用以下 CREATE 语句创建的 ItemOrdered 表 CREATE TABLE Item
我是一名优秀的程序员,十分优秀!