std::atomic<T>::operator++
एक
T
रिटर्न के अनुसार
, तो यह कोड केवल v
एक बार वृद्धि कर देता है:क्या std :: atomic :: ऑपरेटर ++ वास्तव में मूल्य से वापस आ जाता है?
template<class T> void addTwo(std::atomic<T>& v) {
++(++v);
}
इसके अलावा
, std::atomic<T>::operator=
apparently रिटर्न एक T
, इसलिए इस कोड गलत सूचक है कि एक अस्थायी T
को इंगित करने के लिए इस्तेमाल dereferences:
template<class T>
void setOneThenTwo(std::atomic<T>& v) {
auto ptr = &(v = 1);
*ptr = 2;
}
मैं निश्चित रूप से यह सुझाव नहीं दे रहा हूं कि ये कोड पैटर्न अच्छे अभ्यास हैं, हालांकि यह बेहद आश्चर्यजनक टी है ओ मुझे लगता है कि std::atomic
उन्हें तोड़ देता है। *this
के संदर्भ को वापस करने के लिए मैं हमेशा operator=
और उपसर्ग operator++
की अपेक्षा करता हूं।
प्रश्न: वापसी प्रकार के बारे में cppreference यहीं है, और यदि हां, वहाँ std::atomic
व्यवहार करने के लिए एक अच्छा कारण की तुलना में अलग है में निर्मित इस संबंध में प्रकार?
यदि 'ऑपरेटर =' 'टी' देता है, तो' & (v = 1) 'को संकलित भी नहीं करना चाहिए, है ना? –
@ आर। मार्टिनिन्हो फर्नांडीस: क्योंकि यह एक रावल अस्थायी है? –
क्या यह एक लाभार्थी लौटाता है? यदि नहीं, तो दूसरा ++ संकलित नहीं होगा, इसलिए कम से कम आपको छोटी गाड़ी व्यवहार से बचाया जाएगा यदि आप उम्मीद करते हैं कि wrok। – CashCow