2017-04-12 52 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, ""); 
}