2014-09-18 16 views
5

मैंने std::forward उपनाम बनाए हैं जो std::forward के रूप में व्यवहार करना चाहिए।एक 'std :: forward` उपनाम बनाना - अप्रत्याशित परिणाम

template<class T> 
constexpr decltype(auto) fwd(T mValue) noexcept 
{ 
    return std::forward<T>(mValue); 
} 

मैं तो मेरे codebase में fwd<...> साथ std::forward<...> की सभी घटनाओं को बदल दिया।

g++ 4.9 के साथ सभी परियोजनाओं को संकलित - सभी परीक्षण पास हुए, सब ठीक से काम किया।

फिर मैंने clang++ 3.5 के साथ संकलन करने का प्रयास किया। कुछ परीक्षण यादृच्छिक रूप से असफल लगते थे, और कारण fwd<...> था। std::forward<...> के साथ इसे बदलने से असफल परीक्षणों को फिर से तय किया गया।

मैं अनुगामी वापसी प्रकार वाक्य रचना के साथ fwd<...> लेखन की कोशिश की, के रूप में मैंने सोचा था कि decltype(auto) काम नहीं कर रहा था:

template<class T> 
constexpr auto fwd(T mValue) noexcept -> decltype(std::forward<T>(mValue)) 
{ 
    return std::forward<T>(mValue); 
} 

एक ही परिणाम: g++ काम करता है, clang++ नहीं करता है।

मैं तो cppreference पर std::forward के हस्ताक्षर देखा और इस तरह मेरी उर्फ ​​कार्यान्वित: g++ और clang++ पर

template<class T> 
constexpr T&& fwd(std::remove_reference_t<T>& t) { return std::forward<T>(t); } 

template<class T> 
constexpr T&& fwd(std::remove_reference_t<T>&& t) { return std::forward<T>(t); } 

यह काम करता है (सभी परीक्षण पास) दोनों।

decltype(auto) संस्करण क्यों काम नहीं कर रहा है? क्या यह std::forward के समान सटीक रिटर्न प्रकार वापस नहीं करना चाहिए?

+3

आपका उर्फ ​​बलों प्रतियां, चाल के बजाय भूल गया। – Xeo

+2

क्या आपने तर्कों में 'std :: remove_reference_t' को बनाए रखते हुए पिछले दो कार्य कार्यान्वयन में' ऑटो 'या' decltype (auto) 'का उपयोग करने का प्रयास किया है? – iFreilicht

उत्तर

2

आप rvalues ​​के लिए एक कदम संदर्भ के रूप में घोषित करने के लिए mValue

template <typename T> 
constexpr decltype(auto) fwd(std::remove_reference_t<T> &&mValue) 
{ 
    return std::forward<T>(mValue); 
} 
template <typename T> 
constexpr decltype(auto) fwd(std::remove_reference_t<T> &mValue) 
{ 
    return std::forward<T>(mValue); 
} 
+1

मुझे यकीन नहीं है कि 'टी'' टाइप करें और 'या' टाइप करें और ' – programmerjake

+1

ध्यान दें कि एल-वैल्यू संदर्भ वाले संस्करण की भी आवश्यकता है अन्यथा आपको संकलन त्रुटि मिली है: (http://coliru.stacked-crooked.com/a/3505f7b8b37980e2) – Jarod42

+0

@ जारोड 42 ने इसे ठीक किया, धन्यवाद – programmerjake

संबंधित मुद्दे