Eğer sabit bir referans alırsa ne olur?C 11 otomatik:
Aşağıdaki basit kod bir göz atın lütfen
class Foo
{
public:
Foo(){}
~Foo(){}
Foo(const Foo&){}
Foo& operator=(const Foo&) { return *this; }
};
static Foo g_temp;
const Foo& GetFoo() { return g_temp; }
Bu gibi auto
kullanmaya çalıştım:
auto my_foo = GetFoo();
my_foo
dönüş işlevi türü olan Foo
, sabit bir referans olacağını bekliyordum. Ancak, auto
tipi Foo
referans değil. Ayrıca, my_foo
kopyalama g_temp
tarafından oluşturulur. Bu davranış olmadığı çok açık değil.
Foo
referans elde etmek için bu şekilde yazmam gerekli:
const auto& my_foo2 = GetFoo();
auto& my_foo3 = GetFoo();
SoruNeden auto
dönüş bir nesne olarak GetFoo
yazın bir referans değil anlamak mı?
CEVAP
Bu makaleyi okuyun: Appearing and Disappearing consts in C
C 0 x otomatik değişkenler için tür kesintinin aslında aynı .. şablon parametreleri için. (Bildiğim kadarıyla, tek fark Iki otomatik değişken türünden bir çıkarım olabilir arasında başlatıcı şablon parametre türleri olmamakla beraber listeler.) Aşağıdaki tanımlamalar bu nedenle her tür değişkenleri bildirmek tamsayı (int):
auto a1 = i;
auto a2 = ci;
auto a3 = *pci;
auto a4 = pcs->i;
Sırasında şablon parametreleri ve otomatik değişkenler için tür kesintinin, sadece üst düzey consts kaldırılır. İşlevi bir şablon alarak verilen işaretçi veya constness gösterilen referans parametre, ya da korunur denir:
template<typename T>
void f(T& p);
int i;
const int ci = 0;
const int *pci = &i;
f(i); // as before, calls f<int>, i.e., T is int
f(ci); // now calls f<const int>, i.e., T is const int
f(*pci); // also calls f<const int>, i.e., T is const int
Bu davranış, eski bir haber gibi hem C 98 uygulayarak ve C 03. Otomatik değişkenler için karşılık gelen davranış, tabii ki, C 0 x yeni:
auto& a1 = i; // a1 is of type int&
auto& a2 = ci; // a2 is of type const int&
auto& a3 = *pci; // a3 is also of type const int&
auto& a4 = pcs->i; // a4 is of type const int&, too
Eğer bu tür bir referans ya da gösterici ise cv-niteleyici tutabilen beri, bunu yapabilirsiniz:
auto& my_foo2 = GetFoo();
const
(aynı volatile
için de geçerli) olarak bunu belirtmek zorunda kalmadan.
Düzenleme:auto
bir dönüş değeri GetFoo()
türü yerine bir referans ana soru oldu, özür dilerim) neden olduğu sonucuna gelince: bu düşünün
const Foo my_foo = GetFoo();
Yukarıdaki my_foo
bir değeri olduğu için bir kopyasını oluşturur. Eğer auto
lvalue başvuru döndürmek için olsaydı, yukarıda mümkün olmazdı.
Eğer sonunda bir blok bir özel durum o...
Neden zaten değişken sabit olması gere...
Eğer işaretsiz bir değişken için negat...
Eğer bir uyarı penceresi ajax arama sı...
Devre dışı Otomatik Referans Bazı Dosy...