, variadic टेम्पलेट्स, कक्षाएं, कार्यों और lambdas के साथ खेलने के दौरान (from here) मैंने पाया कि निम्न कोड clang++
जबकि नहींg++
के साथ चल साथ चल रहा है:variadic का उपयोग कर टेम्पलेट lambdas: जी के साथ त्रुटि ++ लेकिन बजना ++ के साथ चल रहा
#include <iostream>
#include <string>
using namespace std;
template <class... F>
struct overload_set : F...
{
overload_set(F... f) : F(f)... {}
};
template <class... F>
auto overload(F... f)
{
return overload_set<F...>(f...);
}
int main()
{
auto func = overload (
[](int &val) { val *= 2; },
[](string &arg) { arg += arg; },
[](char &c) { c = 'x'; }
);
int val = 10;
string str = "stackoverflow";
char ch = 's';
cout << val << " : " << str << " : " << ch << endl;
func(val);
func(str);
func(ch);
cout << val << " : " << str << " : " << ch << endl;
return 0;
}
clang
लिए
: coliru
g++
के लिए: coliru
g++
operator()
func(val)
, func(str)
और func(c)
के लिए संदिग्ध operator()
दे रहा है। मुझे लगता है कि operator()
संदिग्ध नहीं होना चाहिए, क्योंकि प्रत्येक के पास अलग-अलग तर्क हैं।
g++
के साथ समस्या क्या है?
@Niall: यह वास्तव में भेड़ के बच्चे या यहां तक कि विविध टेम्पलेट्स के बारे में नहीं है; बेस 'बी 1', 'बी 2' से प्राप्त सरलतम' स्ट्रक्चर 'को भी दिया गया है ... अलग-अलग' ऑपरेटर() (एक्स एंड) 'कार्यों के साथ, जी ++ को बी 1 :: ऑपरेटर() का उपयोग करने की आवश्यकता है; बी 2 :: ऑपरेटर(); का उपयोग करके; (देखें [यहां] (http://coliru.stacked-crooked.com/a/8bc933418b5ff82f))। –
@ टोनीडी। मुझे लगता है कि यह एक क्लैंग बग है - कुछ परीक्षण इंगित करते हैं कि यहां क्लास ऑपरेटर को कैसे हल करता है, यह आधार वर्गों से कैसे काम करता है, यह बताता है कि यह कैसे कॉल ऑपरेटर को हल करता है। – Niall
@Niall gotcha, clang 'x.operator()()' से अलग 'x() 'को हल करता है। –