我们可以不做这样的事吗?
auto f(int n, char *arr[]) -> decltype(char *[n]) /* doesn't work */ {
char *tmp[n]; // RSA, the size depends on argc
for (int i = 0; i < n; ++i) tmp[i] = arr[i];
return tmp;
}
int main(int argc, char *argv[]) {
auto arr = f(argc, argv);
for (auto e : arr)
cout << e << endl;
}
我喜欢值语义(只要我的编译器可以进行正确的内联),尤其是当我将一个大函数重构为一组较小的实用程序时。
编辑:oops,它没有进入C ++ 14 ......(将标题改为&#34; C ++ 14&#34;改为&#34; C ++ 1z(? )&#34;。)&#34;阵列扩展TS&#34 ;?它支持这样的东西吗?
答案 0 :(得分:3)
执行您想要做的事情的规范C ++方法是使用std::vector
(如果在编译时已知元素数量,则使用std::array
)。如M.M的答案所述,C ++不使用VLA。
如果涉及的角色指针不会悬空(例如,在你的argv
情况下),你可以这样做:
std::vector<char*> f(int n, char** arr)
{
std::vector<char*> tmp;
tmp.reserve(n);
for (int i = 0; i < n; ++i)
tmp.push_back(arr[i]);
return tmp;
}
如果指针悬空,最好创建std::string
个对象:
std::vector<std::string> f(int n, char** arr)
{
std::vector<std::string> tmp;
tmp.reserve(n);
for (int i = 0; i < n; ++i)
tmp.emplace_back(arr[i]);
return tmp;
}
(emplace_back
是C ++ 11的新功能。在较旧的C ++版本中,您只能使用push_back
。)
答案 1 :(得分:2)
任何版本的ISO C ++都不允许使用VLA。
有些编译器提供VLA作为扩展。您需要查阅编译器的文档,以查看有关扩展性质的详细信息。
我似乎不太可能通过任何扩展(或者如果VGA使其进入C ++ 17)允许返回VLA,因为返回一个数组(即使是非VLA)也没有意义。
没有语法指定按值返回数组;在return tmp;
行中,tmp
衰减为指针。数组没有值语义。