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)
如果要转换的数组是纯右值,则临时物化转换将应用于该数组。这是因为指针只能指向实际存在的东西。它不会应用于结果指针值。在您的示例中,要转换的数组是左值,因此不应用转换。
\n\n在以下代码中,数组纯右值Arr{0, 1}转换为int*. 应用临时物化转换。
void f(int*) {}\nint main()\n{\n using Arr = int [2];\n f(Arr{0, 1});\n}\nRun Code Online (Sandbox Code Playgroud)\n\nGCC似乎不接受这个代码,但是按照标准这个代码没有问题。请参阅为什么将临时对象作为参数传递需要 std::move?
\n