2015-02-01 10 views
14

मैं (अपने मानकों में 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 के बारे में क्यों शिकायत कर रहा है? क्या मेरे कोड में कुछ गलत है? क्या यह ज्ञात बग है या मुझे इसे सबमिट करना चाहिए?

+0

[** कॉलरू ** पर जीसीसी] के साथ पुन: उत्पादित करना (http://coliru.stacked-crooked.com/a/428c36ca8344c8b4) – Columbo

+4

स्पष्ट रूप से एक बग। [ट्रंक] (http://melpon.org/wandbox/permlink/1FXFunvTq3KwqO8a) पर पुन: उत्पन्न नहीं होता है, इसलिए मुझे लगता है कि यह तय किया गया है। –

+0

@ टी.सी. क्या आप अपनी टिप्पणी को उत्तर के रूप में पोस्ट कर सकते हैं ताकि मैं इसे स्वीकार कर सकूं? –

उत्तर

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