对条件表达式结果的赋值(其中第二个和第三个操作数是相同类型和值类别的变量)是否仍然存在?
Do assignments to the result of conditional expressions where the second and third operands are variables of the same type and value category persist?
在学习值类别时,我发现以下代码片段编译并运行良好:
#include <iostream>
int main() {
int x = 1;
int y = 2;
(true ? x : y) = 4;
std::cout << x << std::endl;
}
下面是输出:
4
首先,我检查了这个说法是否合法C++,我相信是因为以下原因:
N4296 5.16.4 条件运算符 [expr.cond]
如果第二个和第三个操作数是相同值的 gl值 类别并具有相同的类型,结果是该类型和值 类别,如果第二个或第三个操作数是 位域,或者如果两者都是位字段。
假设x
和y
都是左值(因此是 glvalue),则在这两种情况下,条件表达式的结果都是左值。在此基础上,该表达似乎是有效的。然而,目前尚不清楚这是否应该有任何影响。
我不确定条件语句是否应该起作用的原因是因为第二个和第三个操作数类型的类型是int
。即使这个结果int
是一个左值,这并不意味着它必须引用x
或y
。它本质上可能是一个虚拟变量,导致没有效果,并且符合标准。换句话说,我认为没有理由将其解析为int&
而不是单独的int
。
我的问题是...
这种行为是否正确,为什么?
我事先看过这个问题,但不要相信它回答了我的问题。这个问题的答案指的是一个较旧的标准,有不同的措辞,并没有回答我关于结果是否int&
x
的问题。
条件运算符的描述以这样的内容开头。我引用的是最新的工作草案,但所有标准版本的含义都是一样的,随着时间的推移,措辞有一些小的改进:
条件表达式从右到左分组。第一个表达式在上下文中转换为
bool
(7.3)。它 被计算,如果true
,条件表达式的结果是第二个表达式的值, 否则是第三个表达式。仅计算第二个和第三个表达式中的一个。第一个 表达式在第二个或第三个表达式 (6.9.1) 之前排序。
那是 [expr.cond]/1。[expr.cond] 的其余部分解释了如何确定条件表达式的类型和值类别,以及必须应用哪些转换(如果有)。这些部分不会重复结果是第二个或第三个操作数的事实,因为它已经预先说明过了。因此,当第二个和第三个操作数都是类型int
的左值时,结果只能是引用第二个或第三个操作数的左值,因为任何其他结果都与第一段不一致。
- 从模板创建通用打印函数,以打印基元数据类型变量的值
- 指针数据类型变量如何包含对象?
- 将 static_cast<int>(-15) 分配给静态常量字符类型变量
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- 如何为结构类型变量赋值
- 如何将字符类型变量附加到字符串中?
- 共享或私有 openmp 代码中的结构化类型变量
- 有没有办法在 c++ 中制作类型变量?
- 从其他类声明类类型变量会给出 C2143 错误(在"*"之前缺少";")
- 如何检查类中定义的枚举类型变量是否被分配给?
- 将子类实例保存在父类型变量中并通过父变量使用 Child 函数?
- 是否可以在没有结构的情况下创建新的类型变量?
- 为什么类型变量;不调用默认 CTR
- 如何使用CIN将输入整数值获取到char类型变量中
- 如何为 char** 类型变量提供适当的值,以便将其分配给字符串变量
- 在C++标准中哪里说必须初始化 const 内置类型变量的定义
- 为什么可以将其他类型变量用作C 中常量参考参数参数的参数
- Eclipse CDT 打开声明的自动类型变量
- 如何计算长长类型变量中的位数
- 将自动类型变量初始化为零.这种类型安全吗?