कहो दो कार्य देखते हैं:कॉन्स्ट संदर्भों का टुपल कैसे बनाएं?
void ff(const std::tuple<const int&>) { }
template < typename TT >
void gg(const std::tuple<const TT&>) { }
और इन कार्यों के लिए कॉल:
int xx = 0;
ff(std::tie(xx)); // passes
gg(std::tie(xx)); // FAILS !!
जीसीसी 4.7.2 अंतिम पंक्ति संकलित करने के लिए विफल रहता है और रिपोर्ट एक त्रुटि टिप्पणी की तरह:
note: template argument deduction/substitution failed:
note: types ‘const TT’ and ‘int’ have incompatible cv-qualifiers
note: ‘std::tuple<int&>’ is not derived from ‘std::tuple<const TT&>’
पहला सवाल यह है कि यदि यह सी ++ 11 मानक के साथ फिट बैठता है, और यदि ऐसा नहीं होता है, तो क्यों?
इसके अलावा, इस मुद्दे को दूर करने के लिए किसी को गैर-कॉन्स संदर्भों (जो std::tie
बनाता है) को गुजरने के बजाय gg
पर कॉन्स्ट संदर्भों का एक टुपल पास करने की आवश्यकता है। इस के द्वारा किया जा सकता है:
gg(std::tie(std::cref(x)));
हालांकि, std::cref
के लिए एक अतिरिक्त कॉल तरह का थकाऊ है, इसलिए यह ctie
की तरह कुछ जो स्थिरांक संदर्भ उपस्थित टपल होगा करने के लिए बहुत अच्छा होगा।
दूसरा सवाल यह है कि यदि ctie
मैन्युअल रूप से लिखने की आवश्यकता है, और यदि हां, तो क्या यह करने का सबसे अच्छा तरीका है?
template < typename... T >
std::tuple<const T&...> ctie(const T&... args)
{
return std::tie(args...);
}
[प्रासंगिक, लेकिन एक डुप्ली नहीं।] (Http://stackoverflow.com/a/7867662/500104) – Xeo
'वापसी std :: move ();' एक विरोधी पैटर्न है - यह बस सार्वभौमिक रूप से बेहतर है ' वापस लौटें; 'इस विशेष मामले में,' std :: tie (args ...) 'पहले से ही एक रैवल्यू है। [चर्चा के लिए यह जवाब देखें] (http://stackoverflow.com/a/15981233/923854)। –
Casey