2017-04-12 53 views
3

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

但是,如果我具有零长度的数组 -

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

std::decay<decltype(data::key)>犯规衰变到指针类型。我用这作为函数返回类型,它抱怨 -

GCC错误:

error: ‘function’ declared as function returning an array

它工作正常,如果它的长度的数组> = 1

+0

是否可以将它们的源代码从'T key [0]'更改为'T key []'? – kennytm

+0

不幸的是我不能那样做。我们可以为std :: remove_extend添加一个T [0]重载并使其工作吗? – MGH

+2

'T [0]'是非常奇怪的野兽,因为标准要求在SFINAE上下文中形成这种类型的任何尝试都会导致扣除失败。这意味着,编写用于处理普通数组类型的大量TMP代码即使在支持诸如扩展之类的实现的实现上也不适用于它们。 –

回答

0

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

#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, ""); 
}