您可以取消引用临时数组吗?

Jan*_*tke 7 c++ gcc language-lawyer temporary-objects c++20

考虑以下代码:

void foo() {
    int arr[1];
    *arr; // OK

    using T = int[1];
    *T{}; // OK for Clang and MSVC
          // GCC error: taking address of temporary array
}
Run Code Online (Sandbox Code Playgroud)

在 Compiler Explorer 中查看实时代码

我的直觉是,这*T{}应该会导致数组到指针的转换,并且间接寻址的格式良好。不过,我对此并不完全确定。

GCC 是对的还是这是一个错误?是故意的,为了防止开发人员犯错误吗?毕竟,您通常不会取消引用数组。这有记录在任何地方吗?

免责声明
CWG Issue 2548已确认“通过数组纯右值的间接寻址现在也无效”。@StoryTeller 的答案是错误的,并通过假设这也适用于 来误解目标类型*T{}的含义,但该表达式不是指针的初始化。

更多讨论请参见编辑问题EDIT 6555

Lan*_*yer 2

GCC 是正确的,因为间接只能应用于指针。[expr.unary.op]/1 :

一元*运算符执行间接寻址:应用它的表达式应是指向对象类型的指针,或指向函数类型的指针,并且结果 [...]

注意:CWG 1642EDIT 3945将间接寻址应用于纯右值操作数。

*arr可以,因为arr是左值,并且[basic.lval]/6

每当左值作为需要该操作数纯右值的运算符的操作数出现时,就会应用左值到右值、数组到指针或函数到指针标准转换来将表达式转换为纯右值。

数组到指针的转换 ( [conv.array] ) 应用于arr.

T{}已经是纯右值(数组类型),并且这里没有需要数组到指针转换的措辞,所以*T{}不行。