मैं std::thread documentation at cppreference (हमेशा 100% सटीक नहीं, मुझे पता है) के माध्यम से पढ़ रहा था और std::thread
के व्यवहार के लिए निम्नलिखित परिभाषा को ध्यान में रखकर "पॉइंटर-टू-डेटा-सदस्य" (नहीं "सूचक करने वाली सदस्य समारोह") का पहला तर्क (f
) और (थ्रेड-स्थानीय भंडारण करने के लिए कॉपी करने के बाद t1
) ने अपने दूसरे तर्क के रूप में आवश्यक वर्ग की एक वस्तु के रूप:std :: थ्रेड के साथ डेटा सदस्य
एन हैं == 1 और f कक्षा के किसी सदस्य डेटा ऑब्जेक्ट के लिए सूचक है, तो इसे एक्सेस किया जाता है। वस्तु का मूल्य अनदेखा किया जाता है। प्रभावी रूप से, निम्नलिखित कोड निष्पादित किया गया है: t1। * F अगर और t1 का प्रकार या तो टी है, टी या (* t1) से व्युत्पन्न प्रकार के संदर्भ के संदर्भ में। * F अन्यथा।
अब, मैं इस तरह से std::thread
का उपयोग करने की योजना नहीं बना रहा हूं, लेकिन मैं इस परिभाषा से flummoxed हूँ। जाहिर है, केवल एक चीज होती है कि डेटा सदस्य का उपयोग किया जाता है और मूल्य अनदेखा होता है, जो ऐसा प्रतीत नहीं होता है कि इसका कोई भी दुष्प्रभाव नहीं हो सकता है, जिसका अर्थ है (जहां तक मैं कह सकता हूं) यह भी हो सकता है कोई को-अप। (मुझे कुछ स्पष्ट याद आ रही है ...?)
पहले, मैंने सोचा कि यह एक गलत छाप हो सकता है, और यह कहना है कि डेटा सदस्य का उपयोग किया जाता है और फिर कहा जाता है (क्योंकि यह एक कॉल करने योग्य वस्तु हो सकती है, यहां तक कि अगर यह एक समारोह नहीं है), लेकिन मैं जीसीसी-4.7 में निम्न कोड के साथ यह परीक्षण किया है और वास्तव में वहाँ कोई कॉल नहीं है:
#include <iostream>
#include <thread>
struct S
{
void f() {
std::cout << "Calling f()" << std::endl;
}
struct {
void operator()() {
std::cout << "Calling g()" << std::endl;
}
} g;
};
int main(int, char**)
{
S s;
s.f(); // prints "Calling f()"
s.g(); // prints "Calling g()"
std::cout << "----" << std::endl;
auto x = &S::f; // ptr-to-mem-func
auto y = &S::g; // ptr-to-data-mem
(s.*x)(); // prints "Calling f()"
(s.*y)(); // prints "Calling g()"
std::cout << "----" << std::endl;
std::thread t(x, &s);
t.join();
// "Calling f()" printed by now
std::thread u(y, &s);
u.join();
// "Calling g()" not printed
return 0;
}
वहाँ इस परिभाषा जो कुछ भी पूरा करने के लिए प्रतीत नहीं होता है करने के लिए किसी भी उद्देश्य है? इसके बजाय "पॉइंटर-टू-डेटा-सदस्य-कॉल करने योग्य" कार्य को "पॉइंटर-टू-सदस्य-फ़ंक्शन" की तरह क्यों नहीं गुजरते हैं, और एक "पॉइंटर-टू-डेटा-सदस्य-गैर-अक्षम" त्रुटि को गुजरते हैं? वास्तव में, ऐसा लगता है कि इसे लागू करने का सबसे आसान तरीका यह होगा कि, "पॉइंटर-टू-डेटा-सदस्य-कॉल करने योग्य" को कॉल करने के बाद अन्य संदर्भों में "पॉइंटर-टू-सदस्य-फ़ंक्शन" के रूप में कॉल करने के बराबर वाक्यविन्यास होता है (जब तक कि टेम्पलेट विशेषज्ञता और एसएफआईएनएई नियमों की कमजोरियों में कुछ न हो, जिससे उन्हें समान रूप से इलाज करना मुश्किल हो जाता है ...?)
यह वास्तविक कोड के लिए मुझे कुछ चाहिए, लेकिन तथ्य यह है कि यह परिभाषा मौजूद है, मुझे संदेह है कि मुझे संदेह है कि मुझे कुछ मौलिक याद आ रहा है, जो मुझे चिंतित करता है ... क्या कोई मुझे इस बारे में बता सकता है?
+1 यह शब्द 'INVOKE' की परिभाषा से आता है, जो मानक के 20.8.2 में दिया गया है। 'INVOKE' परिभाषा में इस शब्द के बारे में विशेष रूप से आपके जैसा ही एक प्रश्न है: http://stackoverflow.com/questions/12638393/why-does-invoke-facility-in-the-c11- मानक-refer डेटा-सदस्य – jogojapan