मैं इस समय C ++ सीख रहा हूं और बुरी आदतों को उठाने से बचने की कोशिश करता हूं। मैं जो समझता हूं, उससे क्लैंग-टिड्डी में कई "सर्वोत्तम प्रथाएं" होती हैं और मैं यथासंभव सर्वोत्तम तरीके से उनसे चिपके रहने की कोशिश करता हूं (भले ही मैं जरूरी नहीं समझता कि उन्हें अभी तक अच्छा क्यों माना जाता है), लेकिन मुझे यकीन नहीं है कि अगर मैं समझे कि यहाँ क्या अनुशंसित है।
मैंने इस क्लास का उपयोग ट्यूटोरियल से किया है:
class Creature
{
private:
std::string m_name;
public:
Creature(const std::string &name)
: m_name{name}
{
}
};
इससे क्लैंग-टिड्डी से एक सुझाव मिलता है कि मुझे संदर्भ और उपयोग के बजाय मूल्य से गुजरना चाहिए std::move। यदि मैं करता हूं, तो मुझे nameएक संदर्भ बनाने के लिए सुझाव मिलता है (यह सुनिश्चित करने के लिए कि हर बार नकल न हो) और चेतावनीstd::move कोई प्रभाव नहीं होगा क्योंकि nameएक है constइसलिए मुझे इसे हटा देना चाहिए।
जिस तरह से मुझे चेतावनी नहीं मिलती है वह एकमात्र तरीका है const पूरी तरह :
Creature(std::string name)
: m_name{std::move(name)}
{
}
जो तर्कसंगत लगता है, क्योंकि constमूल स्ट्रिंग के साथ खिलवाड़ को रोकने के लिए इसका एकमात्र लाभ था (जो ऐसा नहीं होता क्योंकि मैं मूल्य से गुजरता था)। लेकिन मैंने CPlusPlus.com पर पढ़ा :
यद्यपि ध्यान दें कि-मानक पुस्तकालय- चलती का तात्पर्य है कि स्थानांतरित-से-ऑब्जेक्ट किसी मान्य लेकिन अनिर्दिष्ट स्थिति में छोड़ दिया गया है। जिसका अर्थ है कि, इस तरह के ऑपरेशन के बाद, स्थानांतरित-से-ऑब्जेक्ट का मूल्य केवल नष्ट हो जाना चाहिए या एक नया मूल्य सौंपा जाना चाहिए; इसे एक्सेस करना अन्यथा एक अनिर्दिष्ट मूल्य प्राप्त करता है।
अब इस कोड की कल्पना करें:
std::string nameString("Alex");
Creature c(nameString);
क्योंकि nameStringमूल्य से पारित हो जाता है, std::moveकेवल अमान्य होगाname निर्माणकर्ता के अंदर और मूल स्ट्रिंग को नहीं छूएगा। लेकिन इसके क्या फायदे हैं? ऐसा लगता है कि सामग्री किसी भी समय केवल एक बार कॉपी हो जाती है - अगर मैं कॉल करते समय संदर्भ से गुजरता हूं m_name{name}, अगर मैं इसे पास करने पर मूल्य से गुजरता हूं (और फिर यह स्थानांतरित हो जाता है)। मैं समझता हूं कि यह मूल्य से गुजरने और उपयोग न करने से बेहतर है std::move(क्योंकि यह दो बार कॉपी हो जाता है)।
तो दो सवाल:
- क्या मैं सही ढंग से समझ पाया कि यहाँ क्या हो रहा है?
- वहाँ
std::moveसंदर्भ से गुजर रहा है और सिर्फ बुला का उपयोग करने का कोई उल्टा हैm_name{name}?
clang-tidyहै कि अपने आप को पठनीयता की कीमत पर अनावश्यक रूप से सूक्ष्म रूप से अपनाने के लिए एक शानदार तरीका है। यहां सवाल पूछने के लिए, कुछ और से पहले, यह है कि हम कितनी बार वास्तव में Creatureकंस्ट्रक्टर कहते हैं ।
Creature c("John");एक अतिरिक्त प्रति बनाता है