【问题标题】:Temporary materialization during array-to-pointer conversion数组到指针转换期间的临时实现
【发布时间】: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);
}

【问题讨论】:

标签: c++ language-lawyer


【解决方案1】:

如果它是prvalue,则将临时实现转换应用于要转换的数组。这是因为指针只能指向实际存在的东西。它不适用于生成的指针值。在您的示例中,要转换的数组是左值,因此不应用转换。

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

void f(int*) {}
int main()
{
    using Arr = int [2];
    f(Arr{0, 1});
}

GCC似乎不接受这个代码,但是按照标准这个代码是没有问题的。见Why does passing a temporary object as an argument need std::move?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 2015-08-01
    相关资源
    最近更新 更多