【问题标题】:Workaround for zero-sized arrays in standard C++14?标准 C++14 中零大小数组的解决方法?
【发布时间】:2016-07-31 13:10:51
【问题描述】:

我正在为 Google 的 V8 ECMAScript 引擎开发一个绑定工具包。 考虑这个模板函数:

    template<class... Types> void call_v8_function(v8::Local<v8::Function> function,
                                                   Types... args) {
        ...significant amount of context set-up here...

        v8::Local<v8::Value> call_args[] = { V8Utils::to_js_value(isolate, args)... };

        function->Call(this->context, sizeof...(args), call_args);
    }

它接受可变数量的参数,并使用辅助函数将它们映射到 v8::Value 对象数组。 (参数可以有任意类型,只要它们被 to_js_value 识别)当我使用 GCC 或 Clang 编译时,这非常有效。

然而,在 Visual Studio 中,它完全崩溃了。当这个模板函数在没有任何附加参数的情况下被调用时,一个大小为 0 的数组被声明。虽然被 GCC 和 Clang 接受,但标准不允许这样做,Visual Studio 正确地吐出error C2466: cannot allocate an array of constant size 0

因为我发现这种方法非常方便,所以我正在寻找一种方法来使它工作,而不是为无参数情况复制函数,因为这会导致大量代码重复。

【问题讨论】:

  • 您可以尝试std::array,它已经专门针对零大小的数组(std::array::data() 也似乎fine 用于空数组)
  • 太棒了,这正是我所需要的。要添加答案以便我接受吗?
  • ,...或者创建一个动态分配的数组,你可以声明这样的数组长度为0。虽然使用std::array 可能是您的最佳选择。

标签: c++ arrays visual-c++ c++14 variadic-templates


【解决方案1】:

您可以使用 std::array 代替 c 样式的数组,它已经专门针对零大小的数组。此外,对于您的函数调用,data() 成员对于空数组也是 well-behaved

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 2013-04-17
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    相关资源
    最近更新 更多