मैंने 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
के समान सटीक रिटर्न प्रकार वापस नहीं करना चाहिए?
आपका उर्फ बलों प्रतियां, चाल के बजाय भूल गया। – Xeo
क्या आपने तर्कों में 'std :: remove_reference_t' को बनाए रखते हुए पिछले दो कार्य कार्यान्वयन में' ऑटो 'या' decltype (auto) 'का उपयोग करने का प्रयास किया है? – iFreilicht