gpt4 book ai didi

c++ - VC++中数组到指针的转换

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:47:18 29 4
gpt4 key购买 nike

此代码无法使用 VC++2012 编译。

struct Test
{
int ary1[1];
int ary2[1];
void func() {
int (&ref)[1] = ( true ? ary1 : ary2 );
}
};

int main() {}

编译器说:

error C2440: 'initializing' : cannot convert from 'int *' to 'int (&)[1]'

三元运算符进行数组到指针的转换。

但是,GCC 从不显示此错误。什么是正确的行为?

最佳答案

在标准的 5.16 [expr.cond] 的第 4 段中说:

If the second and third operands are glvalues of the same value category and have the same type, the result is of that type and value category [...]

因此在您的情况下,结果应该是一个左值来键入 1 个 int 的数组。

第 5 段以“否则,结果为纯右值”开头,这显然是第 4 段“如果...”的另一种情况。

在我的阅读中,第 6 段也不适用。

Lvalue-to-rvalue (4.1), array-to-pointer (4.2), and function-to-pointer (4.3) standard conversions are performed on the second and third operands.

如果我们确定结果是一个左值,那么在左值到右值的转换之后我们不可能有一个有效的对象作为结果使用,所以第 6 段必须是继第 5 段开始的“否则……”之后。公平地说,我不认为这是完全明确的,即使我的替代解读会导致更大的不一致。

tl;dr:我认为 gcc 在这种情况下是正确的。

解决方法是使用:*(true ? &ary1 : &ary2) 代替。

关于c++ - VC++中数组到指针的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20443919/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com