इस सी ++ 11 कोड पर विचार करें:क्या सी ++ 11 को इस लैम्ब्डा को म्यूटेबल घोषित करने की आवश्यकता है?
#include <functional>
#include <cstdlib>
template <typename F>
void test(F &&f) {
auto foo = [f]() {
f();
};
foo();
}
int main() {
test(std::bind(std::puts, "hello"));
return 0;
}
जीसीसी और बजना इस रूप में मान्य सी ++ 11 कोड स्वीकार करते हैं, लेकिन विजुअल स्टूडियो 2013 परिवर्तनशील घोषित करने की आवश्यकता है लैम्ब्डा (auto foo = [f]() mutable { ... }
)। अन्यथा मैं इस त्रुटि मिलती है:
error C3848: expression having type '
const std::_Bind<true,int,int (__cdecl *const)(const char *),const char (&)[6]>
' would lose some const-volatile qualifiers in order to call 'int std::_Bind<true,int,int (__cdecl *const)(const char *),const char (&)[6]>::operator()<>(void)
'
दृश्य स्टूडियो परिवर्तनशील बिना इस कोड को अस्वीकार करने का अधिकार है, या यह मान्य सी ++ 11 है?
नहीं, यह मानक के अनुरूप नहीं है। "जी (यू 1, यू 2, ..., यूएम) का प्रभाव' INVOKE (एफडी, v1, v2, ..., vN, result_of <एफडी सीवी (वी 1, वी 2, ..., वीएन 'होगा)> :: प्रकार) '" का अर्थ है कि बाध्य कार्य ऑब्जेक्ट है, तो 'बाइंड' का परिणाम कॉल करने योग्य होना चाहिए। फ़ंक्शन पॉइंटर कॉल करने योग्य है या नहीं, यह 'const' है, इसलिए 'बाइंड' चीज़ भी होनी चाहिए। –
@ माइकसेमोर 'जी'' std :: bind' का वापसी मान है, और केवल 'g (...)' ™ व्यवहार निर्दिष्ट है। मानक को उस वापसी मूल्य के 'कॉन्स्ट'-योग्य संदर्भ के माध्यम से कॉल का समर्थन करने की आवश्यकता होती है? – hvd
मैंने उद्धरण में (20.8.9.1.2/3), साथ ही निम्नलिखित खंड "जहां' सीवी' 'जी' के सीवी-क्वालीफायर का प्रतिनिधित्व करता है। 'जी' को कॉल करना 'एफडी'' के लिए लागू 'जी' के सीवी-क्वालिफायर के साथ 'एफडी' (बाध्य कार्य ऑब्जेक्ट) का आह्वान करने जैसा ही प्रभाव पड़ता है; इसलिए 'const 'की योग्य प्रतिलिपि /' g' के संदर्भ को कॉल मान्य होना चाहिए यदि 'कॉन्स एफडी' का आविष्कार है। यहां, 'एफडी' एक फ़ंक्शन पॉइंटर प्रकार है, जो कॉल करने योग्य है या नहीं, यह 'const' है। –