Şu anda C ++ öğreniyorum ve kötü alışkanlıklardan kaçınmaya çalışıyorum. Anladığım kadarıyla, clang-tidy birçok "en iyi uygulama" içeriyor ve bunlara mümkün olduğunca en iyi şekilde bağlı kalmaya çalışıyorum ( bunların neden iyi kabul edildiğini tam olarak anlamamama rağmen), ancak emin değilim burada neyin önerildiğini anlayın.
Bu dersi öğreticiden kullandım:
class Creature
{
private:
std::string m_name;
public:
Creature(const std::string &name)
: m_name{name}
{
}
};
Bu, clang-tidy'den referans ve kullanım yerine değere göre geçmem gerektiği önerisine yol açar std::move. Ben bunu yaparsak, öneri yapmak olsun nameve uyarıyı (her zaman kopyalanan almaz sağlamak için) bir başvuru std::movenedeniyle herhangi bir etkisi olmaz namebir olduğunu constbunu kaldırmalısınız bu yüzden.
Bir uyarı constalmamamın tek yolu tamamen kaldırmaktır :
Creature(std::string name)
: m_name{std::move(name)}
{
}
Bu mantıklı görünüyor, çünkü tek faydası constorijinal dizeyle karışıklığı önlemekti (bu, değere göre geçtiğim için olmuyor). Ama CPlusPlus.com'da okudum :
Her ne kadar standart kitaplıkta taşıma işleminin taşınan nesnenin geçerli ancak belirtilmemiş bir durumda kaldığı anlamına geldiğini unutmayın. Bu, böyle bir işlemden sonra, taşınan nesnenin değerinin yalnızca yok edilmesi veya yeni bir değer atanması gerektiği anlamına gelir; aksi takdirde ona erişmek, belirtilmemiş bir değer verir.
Şimdi şu kodu hayal edin:
std::string nameString("Alex");
Creature c(nameString);
Çünkü nameStringdeğeriyle geçirilen, std::moveancak geçersiz kılar namekurucu içinde ve orijinal dize dokunmayın. Ama bunun avantajları nelerdir? Görünüşe göre içerik her nasılsa yalnızca bir kez kopyalanacak - aradığımda referans olarak geçersem, geçtiğimde m_name{name}değere göre geçersem (ve sonra taşınır). Bunun değere göre geçmekten ve kullanmamaktan daha iyi olduğunu anlıyorum std::move(çünkü iki kez kopyalanır).
Yani iki soru:
- Burada ne olduğunu doğru anladım mı?
std::moveReferansla geçmeyi kullanıp sadece çağırmanın herhangi bir avantajı var mım_name{name}?
Creature c("John");fazladan bir kopya oluşturur