Belirsiz Örtülü Nesne Oluşturma


9

Yana düşük seviyeli nesne manipülasyonu için nesnelerin P0593 Örtülü oluşturulması kabul edilmiştir, nesneler artık oluşturulabilir dolaylı 20 C ++.

Özellikle önerisi getirdiği ifade (örneğin belirli operasyonlar verir std::mallocotomatik olarak) belirli tipte nesnelerin ömrünü, sözde oluşturmak ve başlatmak örtük-ömür türleri , eğer böyle nesnelerin tanıtımı için aksi tanımsız davranışı ile bir program neden olur tanımlanmış davranış. Bkz. [İntro.object] / 10 .

Taslak şimdi ayrıca, program tanımlı davranışı vermek için dolaylı olarak oluşturulabilecek bu tür nesnelerin birden çok kümesi varsa , bu kümelerden hangisinin oluşturulacağını belirtmektedir . (İlgili cümle erişebildiğim son teklif revizyonunda mevcut görünmüyor, R5, ancak taslak taahhütte.)

Aslında, örtük olarak oluşturulan bu nesne kümesi seçiminin gözlemlenebilir olduğu bir program var mı? Başka bir deyişle, bu yeni kural aracılığıyla tanımlanmış, ancak belirtilmemiş bir davranışa sahip bir program var mı, öyle ki, örtük nesne türlerinin (birden fazla olası nesneden) oluşturulmuş çıktıdan çıkması mümkün mü?

Yoksa bu cümle sadece soyut makinede programın yürütülmesini açıklığa kavuşturmak mıydı (gözlemlenebilir etki olmadan)?


2
(OT) örtük olarak oluşturulmuş bir nesne int ise, buna "örtük int" diyebilir miyiz?
MM

Belirtilmemiş setten eleman seçiminin malloc noktasında bilinmesi gerekip gerekmediği belirsiz görünüyor
MM

@MM Set seçiminin, yürütme akışı dışındaki tüm program yürütmesi için soyut olarak tek bir seçenek olarak kabul edildiğini varsaydım, ancak oluşturma işlemi doğrudan söz konusu işlemde (yani std::malloc) gerçekleşiyorsa, aksi takdirde tanımla ilgili sorunlar yaşarsınız. geleceğe bağlı olmak.
Ceviz

Bu konuda başka bir soru yaptım, stackoverflow.com/questions/60627249 . Tabii ki daha fazla sonuç akla geliyor ama her seferinde bir soru ..
MM

Seçim “doğru” yapılması için hiçbir yolu yoktur çünkü önemli olan o kadar ayırt etmek imkansız olduğunu önerisi iddialar, sadece optimizasyonlar o aksi (olurdu önlemek için çok sıkı) geçerli.
Davis Herring

Yanıtlar:


9

Standartta örnek alalım ve biraz değiştirelim:

#include <cstdlib>
struct X { int a, b; };
X *make_x() {
  // The call to std::malloc implicitly creates an object of type X
  // and its subobjects a and b, and returns a pointer to that X object
  // (or an object that is pointer-interconvertible ([basic.compound]) with it),
  // in order to give the subsequent class member access operations
  // defined behavior.
  X *p = (X*)std::malloc(sizeof(struct X) * 2); // me: added the *2
  p->a = 1;
  p->b = 2;
  return p;
}

Daha önce, bu depolama alanında dolaylı olarak oluşturulabilecek yalnızca bir geçerli nesne kümesi vardı - tam olarak bir tane olmalıydı X. Ama şimdi, iki Xs için depolama alanımız var, ancak bunlardan sadece birine yazıyoruz ve bu programdaki hiçbir şey baytların geri kalanına dokunmuyor. Yani dolaylı olarak yaratılabilecek birçok farklı nesne kümesi var - belki iki Xs, belki bir Xve iki ints, belki bir Xve sekiz chars, ...

Hangi setin yaratıldığı gözlemlenemez, çünkü gerçek gözlemler olsaydı, olasılıkları sadece geçerli olan setlere indirgeyecekti. Eğer böyle bir şey yaparsak p[1]->a = 3, olasılıklar evreni sadece iki Xs olana kadar çöker .

Başka bir deyişle, örtük olarak oluşturulmuş birden çok nesne kümesi, yalnızca programda geçerliliklerini ayırt etmek için yeterli gözlem olmadığında olabilir. Ayırmanın bir yolu olsaydı, tanım gereği, hepsi geçerli olmazdı.


Bu sadece benim tahminim.
Barry

Dolayısıyla, tanımlanamayan davranışlar olmaksızın farklı örtük-yaşam boyu tipteki nesnelerin varlığını veya varlığını gözlemlemenin / gözlemlemenin bir yolu olmadığını düşünüyorum. Bu durumda bana göre , standartta "gözlemlenemeyen davranış " ın gerçekte farklı gözlemlenebilir sonuçlara yol açamayan tek kullanımı olduğu görülmektedir .
Ceviz

1
Veya sadece erişimler Çeşidi glvalues aracılığıyla [cv] ne olursa char, unsigned charya std::byte? Önemsiz olarak kopyalanabilen bir nesne de orada olabilir, sanırım?
aschepler

2
Orijinal örnekte bile, tek bir Xnesneyle birlikte bir dizi nesnesi oluşturmak da mümkündür .
TC
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.