这是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个错误。
答案 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]
#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;
}