Myślę, że pytanie jest wystarczająco jasne. Czy auto
słowo kluczowe automatycznie wykryje stałą, czy zawsze zwróci typ inny niż stała, nawet jeśli istnieją np. dwie wersje funkcji (jedna, która zwraca, const
a druga nie).
Tak dla przypomnienia, używam const auto end = some_container.end()
przed moimi pętlami for, ale nie wiem, czy jest to konieczne, czy nawet różni się od normalnego auto
.
cbegin
icend
zwracaconst_iterator
wartość.const auto
nadal ma swój cel i nie jest zbędny.const auto
jest przydatne w tym ogólnym przypadku?const auto x = expr;
różni się od
auto x = expr;
tak jak
const X x = expr;
różni się od
Więc używaj
const auto
iconst auto&
dużo, tak jak gdybyś nie miałauto
.Zwracany typ nie ma wpływu na rozpoznanie przeciążenia: wartość
const
lub nieconst
w lvaluex
nie wpływa na wywoływane funkcjeexpr
.źródło
const
.Rozważ, że masz dwa szablony:
template<class U> void f1( U& u ); // 1 template<class U> void f2( const U& u ); // 2
auto
wydedukuje typ, a zmienna będzie miała ten sam typ co parametru
(jak w tym// 1
przypadku),const auto
sprawi, że zmienna będzie tego samego typu, co parametru
w// 2
przypadku. Więcconst auto
po prostu wymuśconst
kwalifikator.źródło
Kompilator określa typ kwalifikatora automatycznego. Jeśli typ wywnioskowany to
some_type
,const auto
zostanie przekonwertowany naconst some_type
. Jednak dobry kompilator zbada cały zakresauto
zmiennej i ustali, czy jej wartość gdziekolwiek się zmieni. Jeśli nie, kompilator sam wydedukuje typ w następujący sposób:auto
->const some_type
. Wypróbowałem to w Visual Studio Express 2012 i wyprodukowany kod maszynowy jest taki sam w obu przypadkach, nie jestem pewien, czy każdy kompilator to zrobi. Ale dobrą praktyką jest stosowanieconst auto
z trzech powodów:const
naauto
.źródło
const
naauto
razie nie zmienia funkcjonalności programu w żaden sposób . Obejmuje to również sprawdzenie, czy dostępne są funkcje składowe typu const i non-const. Kompilator zrobi to dobrze.