假设我有这样一个函数:
int test(std::array<char, 8>* data) {
char buffer[data->size() * 2];
[... some code ...]
}
很明显,缓冲区的大小可以在编译时计算出:数据constexpr
的大小为8个元素,即16字节。
然而,在使用-Wall
、-pedantic
和-std=c++11
编译时,我遇到了臭名昭著的错误:
警告:变长数组是一个C99特性[-Wvla-extension]
我认为这是有道理的:array::size()
是constexpr
,但它仍然是一个方法,在上面的函数中我们仍然需要解引用指针,这不是constexpr
。
如果我尝试这样做:
int test(std::array<char, 8>& data) {
char buffer[data.size() * 2];
[...]
}
gcc
(尝试版本5.2.0)似乎很开心:没有警告。
但是,对于clang++
(3.5.1),我仍然会收到有关可变长度数组的警告。
在我的情况下,我不能轻易地改变test
的签名,它必须采用指针。那么...几个问题:
在constexpr上下文中获取
std :: array
指针的大小的最佳/最标准方法是什么?指针与引用之间的行为差异是否符合预期?哪个编译器对警告是正确的,
gcc
还是clang
?
size
不是静态成员函数。 - dyp`template
std::size_t arraysize(const std::array& array) { return N; }`
可以在上面使用。但是...这是正确的方式吗?看起来很复杂。 - rabexcstd::tuple_size<decltype(*arr)>::value
? - tforgioneremove_reference_t
,这会使它变得相当长。 - dyp