【发布时间】:2019-12-14 22:59:33
【问题描述】:
从 C++17 开始(更准确地说,从 p0135r1 开始),数组到指针的转换涉及临时实现 - conv.array:
“N T 的数组”或“T 的未知边界数组”类型的左值或右值可以转换为“指向 T 的指针”类型的纯右值。 应用了临时实现转换 ([conv.rval])。 结果是指向数组第一个元素的指针。
为什么?临时实现仅适用于纯右值 - conv.rval:
T 类型的纯右值可以转换为 T 类型的 xvalue。 此转换初始化 T 类型的临时对象 ([class.temporary]) 通过以临时对象作为其评估纯右值从纯右值 结果对象,并产生一个表示临时对象的 xvalue。 T 应该是一个完整的类型。
那么,在数组到指针转换的情况下,临时物化应用于什么?到结果指针纯右值?
以下示例中是否发生临时实现?
void foo(int *a) {}
int main() {
int arr[4];
foo(arr);
}
【问题讨论】:
-
这在open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html的末尾部分解释了我认为这句话只适用于prvalue数组,包含在“NT类型数组的右值”中。
标签: c++ language-lawyer