gpt4 book ai didi

c++ - 在下面的static_strlen 实现中,为什么需要用& 和括号括住str?

转载 作者:太空狗 更新时间:2023-10-29 21:08:45 28 4
gpt4 key购买 nike

如果我将类型更改为 const char str[Len],我会收到以下错误:

error: no matching function for call to ‘static_strlen(const char [5])’

static_strlen 需要一个 const char references 数组,我是否正确?我的理解是数组无论如何都是作为指针传递的,那么元素被引用有什么必要呢?还是这种解释完全不合时宜?

#include <iostream>

template <size_t Len>
size_t
static_strlen(const char (&str)[Len])
{
return Len - 1;
}

int main() {
std::cout << static_strlen("oyez") << std::endl;
return 0;
}

最佳答案

不,函数参数是对 Len 常量字符数组的引用。这就是函数知道长度的方式(假设最后一个字节是 NUL 终止符,因此是 -1)。括号正是为了阻止它成为你认为的样子。

实际上,在 C++ 中并没有引用数组这样的东西,所以即使没有括号,它也不可能是您认为的那样。我猜想(但不确定)对括号的需求只是为了与其他类似类型定义保持一致,例如指向数组的指针:

void fn(const char *a[3]); // parameter a is of type const char**, the 3 is ignored.
void fn(const char (*a)[3]; // parameter a is a pointer to an array of 3 const chars.

这个例子也说明了为什么数组不是指针。预测以下程序的输出,然后运行它:

#include <iostream>

void fn(const char (*a)[3]) {
std::cout << sizeof(a) << "\n" << sizeof(*a) << "\n";
}

void fn2(const char *a[3]) {
std::cout << sizeof(a) << "\n" << sizeof(*a) << "\n";
}

int main() {
const char a[3] = {};
const char **b = 0;
fn(&a);
fn2(b);
}

#if 0
// error: declaration of `a' as array of references
void fn3(const char & a[3]) {
std::cout << sizeof(a) << "\n" << sizeof(*a) << "\n";
}
#endif

关于c++ - 在下面的static_strlen 实现中,为什么需要用& 和括号括住str?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2563737/

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