2016-09-29 4 views
12

के साथ संयुक्त होने पर पागल हो जाता है मुझे लगता है कि मुझे लगता है कि जीसीसी में एक बग के कारण मुझे कोई समस्या है।
वैसे भी, कोई समस्या खोलने से पहले, मैं निश्चित रूप से सुनिश्चित करना चाहता हूं।std :: list :: remove_if एक सामान्य लैम्ब्डा

#include<algorithm> 
#include<list> 

template<typename U> 
struct S { 
    using FT = void(*)(); 
    struct T { FT func; }; 

    template<typename> 
    static void f() { } 

    std::list<T> l{ { &f<int> }, { &f<char> } }; 

    void run() { 
     l.remove_if([](const T &t) { return t.func == &f<int>; }); // (1) 
     l.remove_if([](const auto &t) { return t.func == &f<int>; }); // (2) 
    } 
}; 

int main() { 
    S<void> s; 
    s.run(); 
} 

बजना v3.9 compiles both (1) and (2) अपेक्षा के अनुरूप:

नीचे कोड पर विचार करें।
जीसीसी v6.2 compiles (1), लेकिन यह doesn't compile (2) है।
से त्रुटि आई है:

error: 'f' was not declared in this scope

इसके अलावा, ध्यान दें के रूप में यह इस प्रकार है कि जीसीसी compiles (2) यह संशोधित किया गया है यदि:

l.remove_if([](const auto &t) { return t.func == &S<U>::f<int>; }); // (2) 

जहाँ तक मुझे पता है, const auto &const T & के बजाय का उपयोग कर बदलाव नहीं होना चाहिए इस मामले में व्यवहार।

क्या यह जीसीसी का एक बग है?

+0

मैं क्या गुंजाइश संकलक वर्ग * सामान्य * लैम्ब्डा का प्रतिनिधित्व करने को बनाने वाला सोच रहा हूँ: फ़ाइल गुंजाइश, वर्ग-गुंजाइश, समारोह-गुंजाइश (स्थानीय स्तर के रूप में है, लेकिन वह करता सदस्य के रूप में * नहीं * समर्थन समारोह टेम्पलेट)? – Nawaz

+0

[यहां] से (http://eel.is/c++draft/expr.prim.lambda#4) - _ बंद करने का प्रकार सबसे छोटा ब्लॉक स्कोप, क्लास स्कोप, या नेमस्पेस स्कोप में घोषित किया गया है जिसमें संबंधित लैम्ब्डा है -expression_। मैं कहूंगा 'एस ', यही कारण है कि मुझे लगता है कि यह एक बग है और इसे 'f' की घोषणा _see_ करना चाहिए। – skypjack

+1

@ नवाज शायद [यह] (http://eel.is/c++draft/expr.prim.lambda#10) और भी उपयुक्त है - _ स्थानीय लैम्ब्डा अभिव्यक्ति का पहुंचने का दायरा संलग्न करने के लिए स्कॉप्स का सेट है और अंदरूनी संलग्न समारोह और इसके पैरामीटर_ सहित? – skypjack

उत्तर

8

प्रति [expr.prim.lambda]:

8 - [...] [For] purposes of name lookup (3.4) [...] the compound-statement is considered in the context of the lambda-expression. [...]

MCVE:

template<int> 
struct S { 
    template<int> static void f(); 
    S() { void(*g)(char) = [](auto) { f<0>; }; } 
}; 
S<0> s; 

लैम्ब्डा अभिव्यक्ति के संदर्भ के लिए यौगिक बयान उत्थापन एक स्पष्ट रूप से वैध कार्यक्रम देता है:

template<int> 
struct S { 
    template<int> static void f(); 
    S() { f<0>; } 
}; 
S<0> s; 

तो हाँ, यह एक है जीसीसी में बग

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