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

时间:2015-11-12 03:20:56

标签: c++ c++14 variable-length-array

我们可以不做这样的事吗?

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 ;?它支持这样的东西吗?

2 个答案:

答案 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衰减为指针。数组没有值语义。