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

How this std::string pointer turns into array?

您好,我在使用有关从函数返回数组的教程中的这段代码时遇到问题

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
}

它编译得很好,但我对如何将 std::string* array23 与索引运算符一起使用感到困惑。

我最初认为这是因为 std::string 是一个字符数组,您可以使用索引运算符单独访问它们,但接下来的代码有效,我不明白为什么。

::std::uintptr_t x = 2453;
::std::uintptr_t* pX = &x;
std::cout << "Var: " << pX[0]; // pX prints 2453

The plane arrays(c-style) can be decayed to a pointer to the type of the array,可以使用operator[](即pointer[index])访问pointee。


函数 func returns 对包含 10 个元素的 std::string 的 (c-style) 数组的引用。

如果你用别名把函数写清楚的话,它会是这样的:

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

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

std::string(&)[10] 数组元素可以像普通 c-style 数组一样通过 operator[] 访问。所以问题是为什么您显示的代码有效(即 std::string* array23)?

这是因为上面提到的原因。在

的情况下
std::string* array23 = func(array);

返回的 (c-style) 数组(即来自 func(array);)衰减到指向数组第一个元素的指针。

含义

array23[0]

等同于

*(array23 + 0)

因此有效!这同样适用于 array23[1](即等于 *(array23 + 1))。


如果您在此处写入实际类型,则需要

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