如何将临时C数组传递给constexpr容器

时间:2018-10-04 22:51:55

标签: c++ arrays c++11 templates constexpr

我正在尝试编写一个环绕原始C数组的C ++容器。我想提供一些constexpr功能,但是构造函数遇到了一些小问题。我似乎无法在constexpr上下文中传递r值C数组。这是我想做的“简单的例子”:

#include <iostream>
#include <type_traits>

namespace TEST
{
class Container
{
public:
    using size_type = std::size_t;
    using value_type = uint32_t;
    using const_reference = const value_type&;
    using const_pointer = const value_type*;

    template<size_type SIZE>
    constexpr Container(const value_type (&data)[SIZE])
        : _arr(data), _len(SIZE) {}

    constexpr Container(const_pointer data, size_type len)
        : _arr(data), _len(len) {}

    constexpr size_type size() const
        {return _len;}

    constexpr const_reference operator[](size_type idx) const
        { return _arr[idx]; }

private:
    const_pointer _arr;
    size_type _len;
};
}

int main()
{
    using X = uint32_t[3];
    //Comment/Uncomment the following line to observe error:
    // constexpr TEST::Container mycontainer1(X{4, 5, 6});

    static constexpr uint32_t arr2[] = {1, 2, 3};
    constexpr TEST::Container mycontainer2(arr2, 3);


    constexpr int x = mycontainer2[0];
    std::cout << "Hello, " << x << "!\n";
}

具体来说,我正在寻找一种将C数组传递给constexpr构造函数而不必手动传递size参数或l值的方法。

一些注意事项:

  • 我正在使用GCC 4.8.5,目前无法升级
  • 使用-std=c++11进行编译,目前无法更改
  • 我以reference的身份发现了这个问题,但不能解决我的constexpr的需求

也许有一种方法可以使用可变参数模板之类的东西,但是我现在似乎还很固执。 C ++ 14真的很好,因为我可以只使用constexpr std::initializer_list,但是,a,我现在没有该选项。

1 个答案:

答案 0 :(得分:2)

这里的问题是,临时对象的地址不是常量表达式的允许结果reference)。因此,您不能构造一个constexpr对象在其内部存储临时数组的地址。如果您希望能够包装C样式的数组,也许您应该编写另一个复制其元素的类。这应该在constexpr上下文中起作用。