- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这个程序应该输出 0 还是 1?在我阅读和理解 C++14 标准中引用的段落时,它应该打印 1,但 GCC 和 clang 都打印 0(因为推导类型是 A const
而不是 A常量&
):
#include <iostream>
struct A {};
int main()
{
A a;
A const& ra = std::move(a); // #1
std::cout << std::is_same<decltype(true ? ra : std::move(a)),
A const&>::value; // Prints 0
}
在这种情况下,ra
是一个 A const
左值,而 std::move(a)
是一个 A
xvalue,都是类类型。根据有关条件运算符的标准(重点是我的),结果应该是 A const
类型的 lvalue
,因此 decltype
结果必须是 A const&
:
[expr.cond]/3 Otherwise, if the second and third operand have different types and either has (possibly cv-qualified) class type, or if both are glvalues of the same value category and the same type except for cv-qualification, an attempt is made to convert each of those operands to the type of the other. The process for determining whether an operand expression E1 of type T1 can be converted to match an operand expression E2 of type T2 is defined as follows:
— If E2 is an lvalue: E1 can be converted to match E2 if E1 can be implicitly converted (Clause 4) to the type “lvalue reference to T2”, subject to the constraint that in the conversion the reference must bind directly (8.5.3) to an lvalue.
[...]
在这种情况下,E2是ra
,它是一个左值,另一个可以隐式转换为“对T2的左值引用”,如 //#1
行所示。 “对 T2 的左值引用” 被翻译为 A const&
,因此,std::move(a)
直接绑定(bind)到 类型的左值code>一个const
,转换后,两个操作数具有相同的类型和值类别,因此:
[expr.cond]/3 If the second and third operands are glvalues of the same value category and have the same type, the result is of that type and value category [...].
因此,运算符结果应该是一个左值,decltype
结果应该是一个引用,因此程序应该打印 1。
最佳答案
这个问题措辞笨拙。您应该问表达式 true 的类型和值类别是什么? ra : std::move(a)
应该是。该问题的答案是 A const
类型的纯右值。这随后意味着程序应该打印 0,正如我认为每个编译器都正确地做的那样。
?:
的规则相当复杂。在这种情况下,我们有两个类类型的表达式,我们尝试根据有限的规则子集查看是否可以相互转换。
尝试转换 ra
→ std::move(a)
失败。我们首先尝试使用 target type是不能直接绑定(bind)到ra
的A&&
。然后我们尝试(3.3.1)中的备份计划因为这两个表达式具有相同的基础类类型,但我们的目标表达式至少没有源表达式那样的 cv 限定,所以这也失败了。
尝试转换 std::move(a)
→ ra
失败 (3.1)因为我们需要直接绑定(bind)到一个左值(我们可以将一个右值绑定(bind)到一个 const 左值引用,但这里我们需要绑定(bind)一个左值)。但是,(3.3.1)备份成功,因为现在目标类型 至少与源一样符合 cv 条件。
因此,我们应用转换并继续,就好像第二个操作数是 A const
类型的左值,但第三个操作数现在是 A const
类型的纯右值(而不是 A
类型的 xvalue)。
(4)失败,因为它们不属于相同的值类别。
因此,result is a prvalue .由于它们具有相同的类型,the result is of that type : 一个常量
。
关于c++ - 具有相同底层类类型的条件运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46516285/
我正在努力处理查询的 WHERE 部分。查询本身包含一个基于两个表中都存在的 ID 的 LEFT JOIN。但是,我要求 where 语句仅返回其中一列中存在的最大单个结果。目前我返回连接中的所有值,
我有这个代码来改变文件系统的大小。问题是,即使满足 if 条件,它也不会进入 if 条件,而我根本没有检查 if 条件。它直接进入 else 条件。 运行代码后的结果 post-install-ray
假设我有一个包含 2 列的 Excel 表格:单元格 A1 到 A10 中的日期和 B1 到 B10 中的值。 我想对五月日期的所有值求和。我有3种可能性: {=SUM((MONTH(A1:A10)=
伪代码: SELECT * FROM 'table' WHERE ('date' row.date 或 ,我们在Stack Overflow上找到一个类似的问题: https://stackove
我有下面这行代码做一个简单的查询 if ($this->fulfilled) $criteria->addCondition('fulfilled ' . (($this->fulfilled
如果在数据库中找到用户输入的键,我将尝试显示“表”中的数据。目前我已将其设置为让数据库检查 key 是否存在,如下所示: //Select all from table if a key entry
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
在MYSQL中可以吗 一共有三个表 任务(task_id、task_status、...) tasks_assigned_to(ta_id、task_id、user_id) task_suggeste
我想先根据用户的状态然后根据用户名来排序我的 sql 请求。该状态由 user_type 列设置: 1=活跃,2=不活跃,3=创始人。 我会使用此请求来执行此操作,但它不起作用,因为我想在“活跃”成员
下面两个函数中最专业的代码风格是什么? 如果函数变得更复杂和更大,例如有 20 个检查怎么办? 注意:每次检查后我都需要做一些事情,所以我不能将所有内容连接到一个 if 语句中,例如: if (veh
我在 C# 项目中使用 EntityFramework 6.1.3 和 SQL Server。我有两个查询,基本上应该执行相同的操作。 1. Exams.GroupBy(x=>x.SubjectID)
我试图在 case when 语句中放入两个条件,但我在 postgresql 中遇到语法错误 case when condition 1 and condition 2 then X else Y
我正在构建一个连接多个表的查询,一个表 prodRecipe 将包含某些行的数据,但不是全部,但是 tmp_inv1 将包含所有行的计数信息。问题是,tmp_inv1.count 取决于某个项目是否在
我有一个涉及 couples of rows which have a less-than-2-hours time-difference 的查询(~0.08333 天): SELECT mt1.*,
我有一个包含许多这样的 OR 条件的代码(工作正常)来检查其中一个值是否为空,然后我们抛出一条错误消息(所有这些都必须填写) } elsif ( !$params{'account'}
我有一个名为 spGetOrders 的存储过程,它接受一些参数:@startdate 和 @enddate。这将查询“订单”表。表中的一列称为“ClosedDate”。如果订单尚未关闭,则此列将保留
在代码中,注释部分是我需要解决的问题...有没有办法在 LINQ 中编写这样的查询?我需要这个,因为我需要根据状态进行排序。 var result = ( from contact in d
我正在尝试创建一个允许省略参数的存储过程,但如果提供了参数,则进行 AND 操作: CREATE PROCEDURE MyProcedure @LastName Varchar(30)
我正在寻找一种方法来过滤我的主机文件中的新 IP 地址。我创建了一个脚本,每次我用来自矩阵企业管理器的数据调用它时都会更新我的主机文件。它工作正常。但是我必须找到一个解决方案,只允许更新 10.XX.
所以我正在做一种 slider ,当它完全向下时隐藏向下按钮,反之亦然,当向上按钮隐藏时,我遇到了问题。 var amount = $('slide').attr('number'); $('span
我是一名优秀的程序员,十分优秀!