数组到指针转换期间的临时实现

Jan*_*šil 7 c++ language-lawyer

从C ++ 17开始(更确切地说,从p0135r1开始),数组到指针的转换涉及临时实现-conv.array

可以将“ NT数组”类型或“ T的未知边界数组”类型的左值或右值转换为“指向T的指针”类型的prvalue。 应用临时物化转换([conv.rval])。 结果是一个指向数组第一个元素的指针。

为什么?临时物化仅适用于prvalues- conv.rval

可以将类型T的prvalue转换为类型T的xvalue。此转换通过将临时对象作为其结果对象来评估prvalue,从而从prvalue初始化类型T的临时对象([class.temporary])。表示临时对象的xvalue。T应为完整类型。

那么,在数组到指针转换的情况下,将临时实现应用于什么?到结果指针prvalue?

在以下示例中,是否会发生临时实现?

void foo(int *a) {}
int main() {
    int arr[4];
    foo(arr);
}
Run Code Online (Sandbox Code Playgroud)

L. *_* F. 2

如果要转换的数组是纯右值,则临时物化转换将应用于该数组。这是因为指针只能指向实际存在的东西。它不会应用于结果指针值。在您的示例中,要转换的数组是左值,因此不应用转换。

\n\n

在以下代码中,数组纯右值Arr{0, 1}转换为int*. 应用临时物化转换。

\n\n
void f(int*) {}\nint main()\n{\n    using Arr = int [2];\n    f(Arr{0, 1});\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

GCC似乎不接受这个代码,但是按照标准这个代码没有问题。请参阅为什么将临时对象作为参数传递需要 std::move?

\n