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
GCC 是正确的,因为间接只能应用于指针。[expr.unary.op]/1 :
一元
*
运算符执行间接寻址:应用它的表达式应是指向对象类型的指针,或指向函数类型的指针,并且结果 [...]
注意:CWG 1642和EDIT 3945将间接寻址应用于纯右值操作数。
*arr
可以,因为arr
是左值,并且[basic.lval]/6:
每当左值作为需要该操作数纯右值的运算符的操作数出现时,就会应用左值到右值、数组到指针或函数到指针标准转换来将表达式转换为纯右值。
数组到指针的转换 ( [conv.array] ) 应用于arr
.
T{}
已经是纯右值(数组类型),并且这里没有需要数组到指针转换的措辞,所以*T{}
不行。