如何返回对十个字符串数组的引用

时间:2014-06-10 02:30:13

标签: c++

这是C ++ Primer 5th的练习。我不知道怎么解决它?

问题描述为:

为函数编写声明,该函数返回对十个字符串数组的引用,而不使用尾随返回,decltype或类型别名。

我的代码:

#include <iostream>
#include <string>

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

int main()
{
    std::string a[10];
    std::string (&b)[10] = func(a);
    for (const auto &c : b)
        std::cout << c << std::endl;
    return 0;
}

编译错误:

  

e6_36.cc:6:12:错误:对类型'std :: string的非const左值引用   [10]'不能绑定到不相关类型的值'std :: string *'(又名   'basic_string,allocator&gt; *')

     

返回a;

       ^
     

生成了1个错误。

2 个答案:

答案 0 :(得分:1)

您可以通过引用传递数组,因此您可以将其返回:

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

或者为了使事情更清楚,请使用typedef作为字符串数组:

typedef std::string StrArray[10];

StrArray& func2(StrArray& a) {
   return a;
}

修改

当你这样做时:

std::string (&func(std::string a[])) [10]
{
    return a; // error !
}

参数a是一个std::string的数组,并衰减到指向std::string*的指针,该指针由值传递(因此,复制):您要求编译器绑定一个非const引用(返回类型)到临时,这在C ++中是非法的。

答案 1 :(得分:0)

string(&amp; func(string(&amp; as)[10]))[10]

  • string(&amp; as)[10]是对10个字符串类型元素的数组的引用。
  • func(string(&amp; as)[10])说我们可以调用func,其参数是对10个字符串类型元素的数组的引用。
  • (&amp; func(string(&amp; as)[10]))表示引用为return。
  • (&amp; func(string(&amp; as)[10]))[10]说引用产生一个大小为10的数组。
  • string(&amp; func(string(&amp; as)[10]))[10]表示数组中的元素类型是字符串类型。
#include <iostream>    
#include <string>    

std::string (&func(std::string(&as)[10]))[10]    
{  
    for (int i = 0; i != 10; ++i) {  
        as[i] = as[i] + " number " + std::to_string(i); //append to string  
    }  
    return as;  
}  

int main()  
{  
    std::string array_str[10];  
    // initialize array with "I am"  
    for (auto &str : array_str) {  
        str = "I am";  
    }  
    // give reference of string[10] to func
    using aStr = std::string[10];   // alias   
    aStr &ref_aStr = func(array_str);
    // print to see results
    for (auto str : ref_aStr) {
        std::cout << str << std::endl;
    }
    return 0;  
}