"const auto" nun bir anlamı var mı?


83

Bence soru yeterince açık. Will autoanahtar kelime const-lik otomatik algılama, ya da her zaman örnek olsa bile, bir const olmayan türünü döndürür. bir fonksiyonun iki versiyonu (biri dönen const, diğeri dönmeyen ).

Sadece kayıt için, const auto end = some_container.end()for-loop'larımdan önce kullanıyorum , ancak bunun gerekli olup olmadığını veya normalden farklı olup olmadığını bilmiyorum auto.

Yanıtlar:


32

Belki kafa karıştırıyorsun const_iteratorve const iterator. İlki const öğeleri üzerinde yinelenir, ikincisi hiç yineleme yapamaz çünkü operatorsüzerinde ++ ve - kullanamazsınız .

Çok nadiren container.end(). Genellikle kullanacaksınız:

const auto end = container.end();
for (auto i = container.begin(); i != end; ++i) { ... }

12
cbeginve cendbir const_iteratordeğere göre döndür. const autoyine de bir amacı vardır ve gereksiz değildir.
dalle

2
Peki const autobu genel durumda yararlı mı?
rubenvb

@dalle: Sen yorum yapamadan paragrafımı kaldırdım, sadece saçma sapan şeyler söylediğimi fark ettim :)
Benoit

2
Birisi çok fazla sql yazıyor. :)
Andres Jaan Tack

3
auto, const tarafından & ile değiştirildi, örneğin bir foreach'te
Janosimas

97
const auto x = expr;

farklı

auto x = expr;

gibi

const X x = expr;

farklı

X x = expr;

Öyleyse kullan const autove const auto&çok, tıpkı sahip olmasaydın yapacağın gibi auto.

Aşırı yük çözünürlüğü dönüş türünden etkilenmez: constveya constlvalue üzerindeki hayır , xhangi işlevlerin çağrıldığını etkilemez expr.


17
Hayır. Değişkeni değiştirmeyecekseniz (veya değiştirmeyecekseniz), beyan edilmelidir const.
Paul J. Lucas

7

İki şablonunuz olduğunu düşünün:

template<class U> void f1( U& u );       // 1
template<class U> void f2( const U& u ); // 2

autotürü çıkaracaktır ve değişken parametre ile aynı türe sahip olacaktır u( // 1durumda olduğu gibi ), const autodeğişkeni durumdaki parametrenin usahip olduğu türden yapacaktır // 2. Yani niteleyiciyi const autozorla const.


3

Derleyici, otomatik niteleyicinin türünü çıkarır. Çıkarılmış tür ise some_type, türüne const autodönüştürülecektir const some_type. Ancak, iyi bir derleyici autodeğişkenin tüm kapsamını inceleyecek ve değerinin herhangi bir yerde değişip değişmediğini bulacaktır. Değilse, derleyicinin kendisi türü şu şekilde çıkaracaktır: auto-> const some_type. Bunu Visual studio express 2012'de denedim ve üretilen makine kodu her iki durumda da aynı, her derleyicinin bunu yapacağından emin değilim. Ancak, const autoüç nedenden dolayı kullanmak iyi bir uygulamadır :

  • Kodlama hatalarının önlenmesi. Bu değişkenin değişmemesini istediniz ama bir şekilde kapsamı içinde bir yerde değişti.
  • Kod okunabilirliği geliştirildi.
  • Nedense anlamak etmiyorsa derleyici yardım constiçin auto.

Mümkünse derleyici const sonucunu çıkarmayacaktır ... Yalnızca türünü çıkaran ifade zaten kendi başına const ise const ekler. Bir derleyici, mümkün olduğu için sadece const eklerse, program semantiği, belirli derleyicinin const'ı çıkarsayıp çıkaramadığına bağlı olarak çağrılan const ve const olmayan üye işlevleri gibi bozulabilir. Bu yüzden son noktanızın yanlış olduğunu düşünüyorum.
rubenvb

@rubenvb C ++ standartları, derleyicilerin istenen optimizasyonlara bağlı olarak kodu kendilerine uygun şekilde yeniden düzenlemelerine izin verir. Bir derleyici anlamak için Tamamen yasal olan constiçin auto herhangi bir şekilde bir program işlevselliğini değişen değilse . Bu, const ve const olmayan üye işlevlerinin mevcut olup olmadığını da içerir. Derleyici bunu doğru yapacaktır.
BJovke
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.