मुझे कोई सराहना होगी कि कोई मुझे एक मजेदार की छोटी प्रतिलिपि बनाने की क्षमता के बारे में संकेत दे सकता है (लैम्बडा का उपयोग किया जाना है)। जैसा कि this question में बताया गया है, यह कार्यान्वयन है कि लैम्ब्डा तुच्छ रूप से प्रतिलिपि बनाने योग्य है या नहीं। उदाहरण के लिए इस प्रश्न के अंत में दिखाए गए कोड के लिए जीसीसी (5.4) और एमएसवीसी (2015) दोनों आग लगते हैं कि इन्हें असाधारण रूप से असाइन करने योग्य प्रतिलिपि नहीं है।त्रिकोणीय प्रतिलिपि के लिए परीक्षण करने के लिए कैसे परीक्षण करें lambdas
मुझे उम्मीद है कि struct
this
पॉइंटर रखते हुए और प्रत्येक कैप्चर किए गए मान (यदि कोई हो) की प्रतिलिपि रखते हुए इन प्रकार के लैम्ब्डा का प्रतिनिधित्व किया जाए। इसलिए वे सभी तुच्छ रूप से प्रतिलिपि बनाने योग्य प्रतीत होते हैं - कम से कम उस मामले के लिए जब कब्जे वाले मूल्यों को तुलनीय रूप से कॉपी करने योग्य होते हैं।
मेरा असली उपयोग केस इस सवाल को चला रहा है कि मैं एक कॉलबैक (std::function
का आवृत्ति संस्करण जो आवंटित नहीं करता है और बहुत सरल मज़ेदारों के लिए है) का उपयोग कर रहा है जो एक निश्चित बफर रखता है जिसमें यह प्रतिलिपि बनाता है (जगह में) पारित डॉक्टर फिर मुझे उम्मीद है कि इन कॉलबैक को कॉपी/असाइन करने में सक्षम होने के लिए, लेकिन इसके लिए काम करने के लिए (बॉक्स के बाहर) इन निश्चित बफर की सरल याद-प्रतिलिपि उनके अंदर रखे गए मकसदों को कॉपी/असाइन करने के बराबर होनी चाहिए। test_functor()
में
कल्पना कीजिए कि नीचे मैं
new
नियुक्ति जैसे कार्य करें:तो मैं दो प्रश्न हैं जैसे
new (&buffer) F(functor)
यह नीचे दिखाया गया lambdas के प्रकार के लिए सिर्फ
memcopy
इस बफर करने के लिए सुरक्षित है? मुझे उम्मीद है कि ऐसा इसलिए होना चाहिए क्योंकि सभी मामलों के लिए केवलthis
पॉइंटर कैप्चर किया गया है या कैप्चर किए गए मानों को तुलनीय रूप से कॉपी करने योग्य हैं, लेकिन यह अच्छा होगा अगर कोई इसकी पुष्टि कर सके।मैं कैसे परीक्षण कर सकता हूं कि स्मृति की सरल प्रतिलिपि जहां मज़ेदार रखा जाता है वह मज़ेदार की प्रतिलिपि के बराबर है? यदि पहले प्रश्न का उत्तर सकारात्मक है तो
std::is_trivially_copy_assignable
सही उत्तर नहीं है।
#include <type_traits>
template <typename F>
void test_functor(const F& functor)
{
static_assert(std::is_trivially_destructible<F>::value,
"Functor not trivially destructible");
static_assert(std::is_trivially_copy_constructible<F>::value,
"Functor not trivially copy constructible");
static_assert(std::is_trivially_copy_assignable<F>::value,
"Functor not trivially copy assignable");
}
struct A
{
void test() { test_functor([this]() { }); }
};
struct B
{
void test() { test_functor([this](int v) { value = v; }); }
int value;
};
struct C
{
void test(int v) { test_functor([=]() { value = v; }); }
int value;
};
int main()
{
A a;
B b;
C c;
a.test();
b.test();
c.test(1);
return 0;
}
आपको 'is_trivially_copyable' का उपयोग करना चाहिए, न कि' is_trivially_meow_constructible' या 'is_trivially_meow_assignable' है। Lambdas कभी भी असाधारण रूप से कॉपी (या चाल) असाइन करने योग्य नहीं हैं क्योंकि उनकी प्रति असाइनमेंट ऑपरेटर हटा दिया गया है; जो उन्हें आवश्यक रूप से कॉपी करने योग्य नहीं होने से रोकता है। –
@ टी.सी. - क्या आप उत्तर अनुभाग में अपनी टिप्पणी कर सकते हैं? मैं इसे एक जवाब के रूप में चिह्नित करना चाहता हूं क्योंकि आपने सिर पर नाखून मारा है। मुझे पता नहीं था कि लैम्बडास के लिए कॉपी असाइनमेंट हटा दिया गया है। और वास्तव में 'is_trivially_copyable' गुज़र रहा है। धन्यवाद। – AndrzejO