gpt4 book ai didi

c++ - 具有相同底层类类型的条件运算符

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:23:05 24 4
gpt4 key购买 nike

这个程序应该输出 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.

[...]

在这种情况下,E2ra,它是一个左值,另一个可以隐式转换为“对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,正如我认为每个编译器都正确地做的那样。


?: 的规则相当复杂。在这种情况下,我们有两个类类型的表达式,我们尝试根据有限的规则子集查看是否可以相互转换。

尝试转换 rastd::move(a) 失败。我们首先尝试使用 target type是不能直接绑定(bind)到raA&&。然后我们尝试(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/

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