SORU
15 Mayıs 2012, Salı


Bu döngüler C 11 bilinen bir hatadır?

Hadi bazı üye fonksiyonları ile holding 3 çiftler için bir yapı var düşünün:

struct Vector {
  double x, y, z;
  // ...
  Vector &negate() {
    x = -x; y = -y; z = -z;
    return *this;
  }
  Vector &normalize() {
     double s = 1./sqrt(x*x y*y z*z);
     x *= s; y *= s; z *= s;
     return *this;
  }
  // ...
};

Bu kolaylık için biraz yapmacık, ama benzer bir kodu var olduğunu kabul edersiniz eminim. Yöntemlerden size uygun zincir için, örneğin, izin verir:

Vector v = ...;
v.normalize().negate();

Hatta:

Vector v = Vector{1., 2., 3.}.normalize().negate();

Şimdi Eğer biz sağlanan begin() ve end() fonksiyonlarını kullanabiliriz vektörümüz, yeni tarzı için döngü, söyleyecek bir döngü içinde 3 koordinatları x, y ve z (hiçbir şüphe oluşturmak daha "yararlı" örneklerle değiştirme Vektörü ile örneğin String):

Vector v = ...;
for (double x : v) { ... }

Bile yapabiliriz:

Vector v = ...;
for (double x : v.normalize().negate()) { ... }

ve ayrıca:

for (double x : Vector{1., 2., 3.}) { ... }

Ancak, aşağıdaki (bana göre) ayrılır:

for (double x : Vector{1., 2., 3.}.normalize()) { ... }

Önceki iki kullanımları mantıklı bir kombinasyon gibi görünüyor olsa da, bu son kullanım daha önceki iki tamamen iyi durumdayken sarkan bir referans oluşturur bence.

  • Bu doğru ve Yaygın olarak takdir edilir?
  • Hangi kısmı yukarıdaki "kaçınılmalıdır?" kısmı kötü.
  • Dili döngü, geçici için ifade edilmiş bu döngü süresince mevcut olan bu tür için Aralık tabanlı tanımını değiştirerek gelişmiş olurdu?

CEVAP
15 Mayıs 2012, Salı


Bu doğru ve Yaygın olarak takdir edilir?

Evet, olayları kendi anlamak doğru olur.

Hangi kısmı yukarıdaki "kaçınılmalıdır?" kısmı kötü.

Kötü kısmı bir işlevinden döndürülen ve r-değeri bir bağlama geçici bir referans için l-değeri referans alıyor. Bu kadar kötü olduğunu:

auto &&t = Vector{1., 2., 3.}.normalize();

Geçici Vector{1., 2., 3.}'In ömür boyu derleyici normalize dönüş değeri başvuran hiçbir fikri yok çünkü uzun olamaz.

Dili döngü, geçici için ifade edilmiş bu döngü süresince mevcut olan bu tür için Aralık tabanlı tanımını değiştirerek gelişmiş olurdu?

C nasıl çalıştığı ile son derece tutarsız olacaktır.

Geçici veya ifadeler için tembel-değerlendirme çeşitli yöntemler üzerinde bazı sorunlar insanlar zincirleme ifadeler kullanılarak yapılan önleyecek? Evet. Ama aynı zamanda Durum Özel derleyici kodu gerektirir gibi bu çalışmıyor neden olarak kafa karıştırıcı olurdudiğerifade oluşturur.

Bir daha makul bir çözüm olurdu bir şekilde bilgilendirmek derleyici geri dönüş değeri olan bir fonksiyon her zaman bir referans için this, ve bu nedenle eğer dönüş değeri bağlı bir geçici uzatan yap o zaman olur uzatmak doğru geçici. O halde dil düzey bir çözüm.

Şu anda ise derleyici destekliyorsa, normalize bunu yapabilirsinizolamazgeçici çağırdı

struct Vector {
  double x, y, z;
  // ...
  Vector &normalize() & {
     double s = 1./sqrt(x*x y*y z*z);
     x *= s; y *= s; z *= s;
     return *this;
  }
  Vector &normalize() && = delete;
};

Bu Vector{1., 2., 3.}.normalize() v.normalize() iyi çalışır iken bir derleme hatası ver, neden olur. Açıkçası bu gibi doğru şeyler yapmak mümkün olmayacaktır:

Vector t = Vector{1., 2., 3.}.normalize();

Ama aynı zamanda yanlış bir şey yapmak mümkün olmayacaktır.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EmbarkToHeaven

    EmbarkToHeav

    3 EYLÜL 2007
  • EmmightySofia

    EmmightySofi

    25 EYLÜL 2011
  • Matt Steffanina

    Matt Steffan

    1 EYLÜL 2011