我正在尝试编写一个环绕原始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值的方法。
一些注意事项:
-std=c++11
进行编译,目前无法更改constexpr
的需求也许有一种方法可以使用可变参数模板之类的东西,但是我现在似乎还很固执。 C ++ 14真的很好,因为我可以只使用constexpr std::initializer_list
,但是,a,我现在没有该选项。
答案 0 :(得分:2)
这里的问题是,临时对象的地址不是常量表达式的允许结果(reference)。因此,您不能构造一个constexpr
对象在其内部存储临时数组的地址。如果您希望能够包装C样式的数组,也许您应该编写另一个复制其元素的类。这应该在constexpr
上下文中起作用。