निम्नलिखित कोड संकलन नहीं करता है:std :: बाँध और सही अग्रेषण
#include <functional>
template<class ...Args>
void invoke(Args&&... args)
{
}
template<class ...Args>
void bind_and_forward(Args&&... args)
{
auto binder = std::bind(&invoke<Args...>, std::forward<Args>(args)...);
binder();
}
int main()
{
int a = 1;
bind_and_forward(a, 2);
}
अगर मैं सही ढंग से समझ, कारण इस प्रकार है: std::bind
प्रतियां अपने तर्कों, और जब binder
के operator()
कहा जाता है, यह lvalues के रूप में सभी बाध्य तर्कों को पास करता है - यहां तक कि bind
रैवल्यू के रूप में दर्ज किए गए भी हैं। लेकिन invoke
को मूल तर्कों के लिए तत्काल किया गया था, और यह स्वीकार नहीं कर सकता कि binder
इसे पारित करने का प्रयास करता है।
क्या इस समस्या के लिए कोई समाधान है?
लेकिन ऐसे मामले में यह 'std :: ref()' के साथ लिपटे तर्क के लिए संकलित नहीं होगा। –
@ इगोरआर। उस के लिए अपडेट किया गया - 'बाइंड()' 'std :: ref()' के लिए कुछ खास करता है। तो आपको कुछ खास करना होगा। – Barry