SORU
21 AĞUSTOS 2011, Pazar


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
21 AĞUSTOS 2011, Pazar


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ı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 2ndfloor91

    2ndfloor91

    17 Kasım 2007
  • metal571

    metal571

    30 Mayıs 2006
  • ParryGripp

    ParryGripp

    12 AĞUSTOS 2006