मैं (अपने मानकों में auto
साथ lambdas) एक अजीब व्यवहार बहुरूपी सी ++ 14 lambdas का उपयोग कर पाया गया है:सी ++ 14 पॉलिमॉर्फिक लैम्बडास के साथ संभावित जीसीसी बग?
स्निपेट 0:
#include <iostream>
template<typename T> void doLambda(T&& mFn)
{
std::forward<T>(mFn)(int{0});
}
template<typename T> void test(T&& mV)
{
doLambda([&mV](auto mE)
{
std::forward<decltype(mV)>(mV);
});
}
int main() { test(int{0}); return 0; }
बजना ++ 3.5.1 : स्निपेट संकलित और सफलतापूर्वक चलाता है।
जी ++ 4.9.2:
example.cpp: In instantiation of
'test(T&&)::<lambda(auto:1)> [with auto:1 = int; T = int]'
:5 : required from
'void doLambda(T&&) [with T = test(T&&) [with T = int]::]'
13 : required from'void test(T&&) [with T = int]'
18 : required from here
12 : error:'mV'
was not declared in this scope
std::forward<decltype(mV)>(mV);
^Compilation failed
स्निपेट 1: टुकड़ा संकलन करने में विफल रहता है
स्निपेट 0 से फर्क सिर्फ इतना है कि auto
लैम्ब्डा के अंदर था है int
पर बदल दिया गया।
#include <iostream>
template<typename T> void doLambda(T&& mFn)
{
std::forward<T>(mFn)(int{0});
}
template<typename T> void test(T&& mV)
{
doLambda([&mV](int mE)
{
std::forward<decltype(mV)>(mV);
});
}
int main() { test(int{0}); return 0; }
बजना ++ 3.5.1: टुकड़ा संकलित करता है तथा सफलतापूर्वक चलता।
जी ++ 4.9.2: स्निपेट संकलित करता है और सफलतापूर्वक चलता है।
स्निपेट 3:
लैम्ब्डा अब यथा-स्थान कहा जाता है। auto
अभी भी उपयोग किया जाता है।
#include <iostream>
template<typename T> void test(T&& mV)
{
[&mV](auto mE)
{
std::forward<decltype(mV)>(mV);
}(int{0});
}
int main() { test(int{0}); return 0; }
बजना ++ 3.5.1: टुकड़ा संकलित करता है तथा सफलतापूर्वक चलता।
जी ++ 4.9.2: स्निपेट संकलित करता है और सफलतापूर्वक चलता है।
जी ++ स्निपेट 0 के बारे में क्यों शिकायत कर रहा है? क्या मेरे कोड में कुछ गलत है? क्या यह ज्ञात बग है या मुझे इसे सबमिट करना चाहिए?
[** कॉलरू ** पर जीसीसी] के साथ पुन: उत्पादित करना (http://coliru.stacked-crooked.com/a/428c36ca8344c8b4) – Columbo
स्पष्ट रूप से एक बग। [ट्रंक] (http://melpon.org/wandbox/permlink/1FXFunvTq3KwqO8a) पर पुन: उत्पन्न नहीं होता है, इसलिए मुझे लगता है कि यह तय किया गया है। –
@ टी.सी. क्या आप अपनी टिप्पणी को उत्तर के रूप में पोस्ट कर सकते हैं ताकि मैं इसे स्वीकार कर सकूं? –