假设我有一个类似的功能:
int test(std::array<char, 8>* data) {
char buffer[data->size() * 2];
[... some code ...]
}
显然缓冲区的大小可以在编译时评估:数据的constexpr
大小为 8 个元素,8 * 2 = 16 字节。
但是,当使用 编译时,-Wall
我得到了臭名昭著的错误:-pedantic
-std=c++11
警告:可变长度数组是 C99 功能 [-Wvla-extension]
我认为这是有道理的:array::size()
is 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
?