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 ++标准的引用都将不胜感激。
答案 0 :(得分:2)
这与函数参数类型调整([dcl.fct]/5):
有关确定每个参数的类型后,任何类型的参数 “T”数组或函数类型T被调整为“指向T的指针”。
由于类型别名等同于其命名的类型,因此在第一种情况下,类型被确定为char[10]
并调整为char*
。您可以修改指针。
在第二种情况下,您形成char(&)[10]
。它是对数组的引用,即使通过引用也无法分配数组。