C ++ 11'de otomatik anahtar kelimenin motivasyonu ve tuzakları (?)


20

Geçenlerde anahtar kelimesinin autotürü derleyici tarafından çıkarılması gereken bir değişkeni işaretlemek için neden C ++ 11'de seçildiğini merak ediyordum .

auto x = 1;

Dan beri

  1. var diğer programlama dillerinde (ör. C #, Scala, JavaScript) ve
  2. autoGeriye dönük uyumluluğun yeni anlambilimini anladığım kadarıyla (nadiren kullanıldı, ancak önceki C ++ revizyonlarında farklı bir anlamı vardı, bkz. Buraya bakın )

Seçmek için özel bir neden olup olmadığını sormak istedim auto(lehine varveya başka bir anahtar kelime). C ++ 11 standardı yayınlanmadan önce bu konu hakkında özel bir tartışma yapıldı mı?

Ayrıca, eski C ++ kodunu bir C ++ 11 derleyicisiyle derlerken dikkat etmemiz gereken olası uyumsuzluklar var mı?


9
Yeni semantiği autogeriye dönük uyumluluğu bozabilir, ancak anahtar kelimenin 11 öncesi kodda varne sıklıkta autokullanıldığına kıyasla değişken ad olarak ne sıklıkta kullanıldığına bağlı olarak , komite uyumluluğu yeni bir girişten daha az önemli ölçüde bozduğunu seçmiş olabilir. anahtar kelime.
sepp2k

2
"Şu anda olduğu gibi, bu soru Soru-Cevap formatımız için uygun değil. Yanıtların gerçekler, referanslar veya belirli bir uzmanlık tarafından desteklenmesini bekliyoruz, ancak bu soru muhtemelen tartışma, tartışma, oylama veya genişletilmiş tartışma talep edecektir. bu sorunun geliştirilebileceğini ve muhtemelen yeniden açılabileceğini düşünüyorsanız, yardım için SSS bölümüne bakın. ": Bu soru bir gerçek hakkında soruyor: bu konu hakkında bir tartışma var mıydı. İki olası cevap vardır: EVET ve HAYIR.
Giorgio

2
Tabii ki, bu konuda soruyu anlamsız kılan bir tartışma vardı. autoVs varsoruya metnin% 90 tuzdur ve bu soru kesin bir sonuç vardır. (kapatmaya oy veren kişi ben
olmasam da

1
@Telastyn: Bu konuda bir tartışma olduğunu bilseydim, sormazdım. "Auto C varus C ++" veya "auto C ++" için googling bu konuda hiçbir şey döndürmedi.
Giorgio

1
autovarC # için daha önce C # 'da kullanılmaya başlandı, bu yüzden soru C #' ın neden otomatik kullanmıyor olması gerektiğidir.
var'ın

Yanıtlar:


37

Bir dile anahtar sözcük olarak eklemeyi düşündüğünüz hemen hemen her kelime, neredeyse kesinlikle değişken adı veya çalışma kodunun başka bir parçası olarak kullanılmıştır. Bu kelimeyi bir anahtar kelime yaparsanız bu kod kırılır.

İnanılmaz derecede şanslı olan şey auto, zaten bir anahtar kelime olmasıydı, bu yüzden insanların bu adla değişkenleri yoktu, ancak hiç kimse bunu kullanmadı, çünkü varsayılandı. Neden yazmalısınız?

auto int i=0;

ne zaman

int i=0;

tamamen aynı şey demekti?

Gezegendeki bir yerlerde eski yolu 'otomatik' kullanan az miktarda kod vardı. Ancak 'otomatik' kaldırılarak düzeltilebilir ve tekrar çalışır. Bu nedenle, anahtar kelimeyi yeniden düzenlemek oldukça açık bir seçimdi.

Bunun daha açık bir anlam olduğunu düşünüyorum. Varyantlarla ve benzerleriyle çalıştıysanız, gördüğünüzde var, bildirimin, değişkenin türünü belirtmek için klavyedeki tüm tuşlara kendiniz bastığınızdan daha az güçlü bir şekilde yazıldığını düşünebilirsiniz. Bana göre, autoderleyiciden türü kendiniz belirlediğiniz kadar güçlü olan türünü otomatik olarak çıkarmasını istersiniz. Bu yüzden komiteye iyi bir isim veren çok şanslı bir ara oldu.

(Küçük) kırılmayı netleştirmek için:

Olsaydı

auto int i=0;

ve bir C ++ 11 derleyicisi ile derlemeye çalıştığınızda, artık bir hata alırsınız

hata C3530: 'otomatik' başka tür belirtici ile birleştirilemez

Bu önemsiz, sadece otomatik veya int kaldırmak ve yeniden derlemek.

Yine de daha büyük bir sorun var. Olsaydı

auto i = 4.3;

C ve gerçekten eski C ++ kılacak ibir int(bıraktığınız eğer olduğu gibi auto- Varsayılan bildirgesiydi int). Bu kodu derlemeden çok uzun zaman geçtiyseniz veya eski derleyicileri kullanıyorsanız, en azından teoride bu kodlardan bazılarına sahip olabilirsiniz. C ++ 11 double4.3 olduğu için bunu yapar . (Ya da belki floatde, Boks Günü modundayım, ama asıl nokta, bir değil int.) Bu, uygulamanız boyunca ince hatalar getirebilir. Ve derleyiciden herhangi bir uyarı veya hata olmadan. Bu teknedeki insanlar, autobir C ++ 11 derleyicisine geçmeden önce eski şekilde kullanmadığından emin olmak için globablly aramalıdır . Neyse ki, böyle bir kod son derece nadirdir.


Çok açık bir cevap için teşekkürler. +1 Geriye dönük uyumluluğu çoğunlukla zararsız bir şekilde bırakma ile eski kodun yeni anahtar kelime tarafından kırılmama şansı arasındaki dengeyi anlıyorum.
Giorgio

Aslında herhangi bir uyumsuzluk var mı? Bir C ++ 11 derleyicisi yalnızca autobir tür adının ardından geliyorsa yoksaymaz mı?
aaaaaaaaaaaa

1
Visual C ++ 2012 error C3530: 'auto' cannot be combined with any other type-specifierbu satıra diyor
Kate Gregory

3
@KateGregory: Aslında, hiçbir sorun yoktur auto i = 4.3;, çünkü bu C ++ 03 / C ++ 98'de kötü biçimlendirilmiştir. C ++ vermedi değil C89 vardı (ve C99 revizyon düştü) işte örtük int 'kuralını üzerinde taşır.
Bart van Ingen Schenau

1
@Kate Gregory: Bart'ın gözlemlerini dikkate alıp cevabınızı buna göre değiştirebilseydiniz, bunu kabul edilen cevap olarak işaretlerdim.
Giorgio
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.