के साथ संयुक्त होने पर पागल हो जाता है मुझे लगता है कि मुझे लगता है कि जीसीसी में एक बग के कारण मुझे कोई समस्या है।
वैसे भी, कोई समस्या खोलने से पहले, मैं निश्चित रूप से सुनिश्चित करना चाहता हूं।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 &
के बजाय का उपयोग कर बदलाव नहीं होना चाहिए इस मामले में व्यवहार।
क्या यह जीसीसी का एक बग है?
मैं क्या गुंजाइश संकलक वर्ग * सामान्य * लैम्ब्डा का प्रतिनिधित्व करने को बनाने वाला सोच रहा हूँ: फ़ाइल गुंजाइश, वर्ग-गुंजाइश, समारोह-गुंजाइश (स्थानीय स्तर के रूप में है, लेकिन वह करता सदस्य के रूप में * नहीं * समर्थन समारोह टेम्पलेट)? – Nawaz
[यहां] से (http://eel.is/c++draft/expr.prim.lambda#4) - _ बंद करने का प्रकार सबसे छोटा ब्लॉक स्कोप, क्लास स्कोप, या नेमस्पेस स्कोप में घोषित किया गया है जिसमें संबंधित लैम्ब्डा है -expression_। मैं कहूंगा 'एस ', यही कारण है कि मुझे लगता है कि यह एक बग है और इसे 'f' की घोषणा _see_ करना चाहिए। – skypjack
@ नवाज शायद [यह] (http://eel.is/c++draft/expr.prim.lambda#10) और भी उपयुक्त है - _ स्थानीय लैम्ब्डा अभिव्यक्ति का पहुंचने का दायरा संलग्न करने के लिए स्कॉप्स का सेट है और अंदरूनी संलग्न समारोह और इसके पैरामीटर_ सहित? – skypjack