C++ 这个std::string指针如何变成数组?

C++ 这个std::string指针如何变成数组?,c++,arrays,function,pointers,stdstring,C++,Arrays,Function,Pointers,Stdstring,您好,我在这里遇到了关于从函数返回数组的教程中的代码问题 std::string(&func(std::string(&arr)[10]))[10] { return arr; } int main() { std::string array[10] = { "efwefwef","wefffj","mfls","hrkr","sgte","ege&quo

您好,我在这里遇到了关于从函数返回数组的教程中的代码问题

std::string(&func(std::string(&arr)[10]))[10]
{
    return arr;
}

int main()
{
   std::string array[10] = { "efwefwef","wefffj","mfls","hrkr","sgte","ege","ky","retg","sujtre","fl;yiu" };

   std::string* array23 = func(array);
   std::cout << array23[0] << std::endl; // why does this work
   std::cout << array23[1] << std::endl; // why does this work
}
,并且可以使用
操作符[]
(即指针[index])访问指针对象


函数
func
返回对
std::string
s(c样式)数组的引用,其中包含
10个
元素

如果使用别名清楚地编写函数,它将如下所示:

// alias type: the returned type!
using Type = std::string(&)[10];

Type func(std::string (&arr)[10])
{
    return arr;
}
std::string(&)[10]
数组元素可以通过
operator[]
像普通的c样式数组一样访问。所以问题是为什么您显示的代码有效(即
std::string*array23

这是因为上述原因。就

std::string* array23 = func(array);
返回的(c样式)数组(即从
func(array);
)衰减为指向数组第一个元素的指针

意义

array23[0]
相当于

*(array23 + 0)
因此它起作用了!这同样适用于
array23[1]
(即等同于
*(array23+1)


如果在那里编写实际类型,则需要

std::string (&array23)[10] = func(array);
// or
// Type array23 = func(array);

在没有运算符重载的情况下,
a[b]
相当于
*(a+b)
。另外,我不确定func的用途,您可以编写
std::string*array32=array直接。如果一个教程使用像
std::string(&func(std::string(&arr)[10]))[10]
这样复杂的声明,除了教你如何阅读它们之外,它可能不是最好的教程;这份声明太复杂了,几乎任何人都读不懂。使用
typedef
为中间类型创建名称并使用这些名称。“func返回对数组的引用…这意味着…
std::string*array23
…相当于…
std::string(&array23)[10]
…因此…
操作符[]
…工作起来”我觉得这非常误导。两者并不等同。而
[]
工作与
func
返回引用无关。@HolyBlackCat是,在写下答案后实现。根据更新了答案。谢谢你指出。现在应该清楚了。
std::string (&array23)[10] = func(array);
// or
// Type array23 = func(array);