gpt4 book ai didi

C++1z(?) 运行时大小的数组作为返回值

转载 作者:行者123 更新时间:2023-11-30 01:12:40 25 4
gpt4 key购买 nike

我们不能做这样的事情吗?

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;
}

我喜欢值语义(只要我的编译器可以进行适当的内联),尤其是当我将一个大函数重构为一组较小的实用程序时。

编辑:糟糕,它没有进入 C++14...(将标题从“C++14”更改为“C++1z(?)”。)“Array Extensions TS”怎么样“?它支持这样的东西吗?

最佳答案

做您想做的事情的规范 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。)

关于C++1z(?) 运行时大小的数组作为返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33663866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com