然而,我看到标准中另一个似乎依赖于prvalues具有cv限定类型的地方:通过临时材料化转换用prvalues初始化
const
引用。相关措辞可以在9.3.3/5中的多个位置找到。
明显的意图是确保当我们到达实际的临时材料化转换时,[...] 如果转换后的初始值是一个prvalue,则其类型T4将调整为类型“cv1 T4”([conv.qual]),并应用临时材料化转换([conv.rval])[...]
[...] 否则,初始值表达式会被隐式转换为类型为“cv1 T1”的prvalue。应用临时材料化转换并将引用绑定到结果。
7.3.4 临时材料化转换
1. 类型为T的prvalue可以转换为类型为T的xvalue。此转换通过使用临时对象([class.temporary])初始化类型为T的prvalue,将prvalue评估为其结果对象,并生成表示临时对象的xvalue来完成。[...]
类型T作为输入接收到的cv限定包括所需的cv限定。
但在非类非数组prvalue的情况下,7.2.2/2中的cv限定如何保留?
类型2:如果prvalue最初具有类型“cv T”,其中T是cv未限定的非类非数组类型,则在进一步分析之前将表达式的类型调整为T。
或者不会吗?
例如,在此示例中,我们会得到什么样的临时对象?
const int &r = 42;
这个临时的{{const}}还是非{{const}}的?我们可以这样做吗?
const_cast<int &>(r) = 101; // Undefined or not?
不触发未定义行为?如果我没记错,最初的意图是在这种情况下获得一个const int
临时对象。这仍然正确吗?(对于类类型,答案很明确-我们会得到一个const
临时对象。)