gpt4 book ai didi

c++ - constexpr 上下文中 std::array 指针的 size()

转载 作者:可可西里 更新时间:2023-11-01 15:26:21 24 4
gpt4 key购买 nike

假设我有一个函数:

int test(std::array<char, 8>* data) {
char buffer[data->size() * 2];

[... some code ...]
}

显然可以在编译时评估缓冲区的大小:数据的 constexpr 大小为 8 个元素,8 * 2 = 16 字节。

然而,当使用 -Wall-pedantic-std=c++11 编译时,我得到了臭名昭著的错误:

warning: variable length arrays are a C99 feature [-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 的签名,它必须采用指针。所以...几个问题:

  1. 在 constexpr 上下文中获取 std::array pointer 大小的最佳/最标准方法是什么?

  2. 指针与引用的行为差异是否符合预期?哪个编译器对警告是正确的,gcc 还是 clang

最佳答案

我不知道 2。

但是对于 1,我们可以这样做:

template<class T, size_t N>
constexpr std::integral_constant<size_t, N> array_size( std::array<T, N> const& ) {
return {};
}

然后:

void test(std::array<char, 8>* data) {
using size=decltype(array_size(*data));
char buffer[size{}];
(void)buffer;
// [... some code ...]
}

或者:

template<class T, class U, size_t N>
std::array<T,N> same_sized_array( std::array< U, N > const& ) {
return {};
}

void test(std::array<char, 8>* data) {
auto buffer = same_sized_array<char>(*data);
(void)buffer;
// [... some code ...]
}

最后,C++14 清理:

template<class A>
constexpr const decltype(array_size( std::declval<A>() )) array_size_v = {};

void test3(std::array<char, 8>* data) {
char buffer[array_size_v<decltype(*data)>];
(void)buffer;
// [... some code ...]
}

Live example .

关于c++ - constexpr 上下文中 std::array 指针的 size(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32971566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com