2013-08-13 5 views
12

कहो दो कार्य देखते हैं:कॉन्स्ट संदर्भों का टुपल कैसे बनाएं?

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...); 
} 
+3

[प्रासंगिक, लेकिन एक डुप्ली नहीं।] (Http://stackoverflow.com/a/7867662/500104) – Xeo

+2

'वापसी std :: move ();' एक विरोधी पैटर्न है - यह बस सार्वभौमिक रूप से बेहतर है ' वापस लौटें; 'इस विशेष मामले में,' std :: tie (args ...) 'पहले से ही एक रैवल्यू है। [चर्चा के लिए यह जवाब देखें] (http://stackoverflow.com/a/15981233/923854)। – Casey

उत्तर

2

पहला सवाल है कि अगर यह सी ++ 11 मानक के साथ फिट बैठता है, और अगर ऐसा नहीं होता है, तो क्यों?

यह व्यवहार की उम्मीद है। दूसरे मामले में टेम्पलेट तर्क कटौती विफल हो जाती है क्योंकि T नहीं है ताकि tuple<const T&>tuple<int&> बन जाए।

पहले मामले में यह काम करता है क्योंकि tuple<int&> स्पष्ट रूप से tuple<const int&> पर परिवर्तनीय है। यह उपयोगकर्ता द्वारा परिभाषित रूपांतरण है और इस तरह टेम्पलेट तर्क कटौती के दौरान नहीं माना जाता है।

आपके प्रश्न एक एक्स/वाई समस्या की तरह थोड़ा गंध करते हैं। वास्तविक प्रश्न पोस्ट करने पर विचार करें जिसने आपको इस प्रकार के फ़ंक्शन टेम्पलेट/ट्यूपल संयोजन से जुड़े समाधान की तलाश की है।

आपका ctie फ़ंक्शन टेम्पलेट ठीक दिखता है। लेकिन ध्यान रखें कि

auto t = ctie(5); 

मूल रूप से एक खतरनाक संदर्भ उत्पन्न करेगा। तो, आप केवल ctie को केवल lvalues ​​तक सीमित करना चाहते हैं।

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