std::d ecay 一个零长度数组

std::decay an zero length array

本文关键字:一个 数组 ecay std      更新时间:2023-10-16

我正在处理一些遗留的 C 结构 - 我们有零长度数组。我认为这是无效的,但我们必须忍受它。我正在编写一个宏,我想使用 std::d ecay 将数组衰减为指针类型。

但是如果我有一个零长度数组 -

struct data {
   key[0]; <<
};

std::decay<decltype(data::key)>不会衰减为指针类型。我将其用作函数返回类型,它抱怨 -

海湾合作委员会错误:

错误:"函数"声明为返回数组的函数

如果它是一个长度为>= 1 的数组,它可以正常工作

我们可以让编译器的类型检查器,而不是模板替换,为我们做衰减:

#include <type_traits>
template <typename T>
T* as_ptr(T* x) { return x; }
template <typename T>
using DecayToPointer = decltype(as_ptr(std::declval<T>()));

int main() {
    static_assert(std::is_same<DecayToPointer<int[0]>, int*>::value, "");
    static_assert(std::is_same<DecayToPointer<int[1]>, int*>::value, "");
    static_assert(std::is_same<DecayToPointer<int[]>, int*>::value, "");
}
相关文章: