C ++数组作为函数参数

时间:2017-11-20 07:22:01

标签: c++

using Data = char[10];
void f(Data x)
{
    x = nullptr; // this compiles
}
void g(Data &x)
{
    x = nullptr; // this does not compile, msvc complain "expression must be a modifiable lvalue
}

我很困惑为什么f中的赋值表达式编译,但不能用g编译。我希望两个赋值都会失败,因为数组类型不可修改。

任何对c ++标准的引用都将不胜感激。

1 个答案:

答案 0 :(得分:2)

这与函数参数类型调整([dcl.fct]/5):

有关
  

确定每个参数的类型后,任何类型的参数   “T”数组或函数类型T被调整为“指向T的指针”。

由于类型别名等同于其命名的类型,因此在第一种情况下,类型被确定为char[10]并调整为char*。您可以修改指针。

在第二种情况下,您形成char(&)[10]。它是对数组的引用,即使通过引用也无法分配数组。