语法 `const char (&x)[]` 的含义

Meaning of the syntax `const char (&x)[]`

C++ 中语法 const char (&x)[] 的含义是什么,是否类似于通过引用传递指针到函数调用?

是不是和const char x[]一样,定义x为const char*? 如果两者是一样的,我应该在哪里使用 const char (&x)[] 而不是 const char x[]

const char (&)[] 是对 const char 数组的引用。您显示的表达式将 x 声明为其中之一。

Is it the same like const char x[]

这是对其中之一的引用

... which defines x as const char*

嗯,不,我们退一步说。

const char array[5]

array 声明为 5 个常量字符的数组。它声明一个指针。但是,数组很容易在 C++ 中衰减为指针,例如

void foo(const char *);
// ...
foo(array);

是合法的。事实上,数组很容易衰减为指针,因此需要格外小心地将它们传递到某个地方而不会衰减:

template <size_t N>
void bar(const char (&x)[N]);

bar(array);

实际上将获得对数组的引用,作为奖励,允许 bar 推断数组大小。


请注意,指针和数组之间唯一有用的区别是元素的数量 - 当我引用您所说的 const char x[] 时,我假设方括号之间确实有一个数字。如果你忽略它,它对指针没有任何好处,除非你初始化它:

const char x[] = { 'h', 'e', 'l', 'l', 'o' };

仍将允许对 bar 的调用推断出 N=5,即使您从未在代码中写过文字 5


当你想让你的函数接受一个固定长度的数组时也可以使用它:

void fun(const char (&x)[50]);

它也可用于多维数组(但尽可能使用 std::vectorstd::array)。

What is the meaning of the syntax const char (&x)[] in C++

此语法意味着您要使用 对 const char 数组 的引用。

Is it the same like const char x[], which defines x as const char*?

不,不一样,和const char*的主要区别是数组的大小变成了类型的一部分,所以不能传具有不同数量元素的数组。

数组引用的主要用途是在模板中,其中元素的数量比推导的多