Ayrılan depolama birimindeki işaretçi aritmetiğine C ++ 20'den beri izin veriliyor mu?


10

C ++ 20 standardında, dizi türlerinin örtük ömür boyu tür olduğu söylenir .

Örtük olmayan bir ömür boyu türüne sahip bir dizinin dolaylı olarak oluşturulabileceği anlamına mı geliyor? Örtülü bir dizinin oluşturulması dizinin öğelerinin oluşturulmasına neden olmaz mı?

Bu durumu düşünün:

//implicit creation of an array of std::string 
//but not the std::string elements:
void * ptr = operator new(sizeof (std::string) * 10);
//use launder to get a "pointer to object" (which object?)
std::string * sptr = std::launder(static_cast<std::string*>(ptr));
//pointer arithmetic on not created array elements well defined?
new (sptr+1) std::string("second element");

Bu kod artık C ++ 20'den beri UB değil mi?


Belki bu şekilde daha iyidir?

//implicit creation of an array of std::string 
//but not the std::string elements:
void * ptr = operator new(sizeof (std::string) * 10);
//use launder to get a "pointer to the array of 10 std::string" 
std::string (* sptr)[10] = std::launder(static_cast<std::string(*)[10]>(ptr));
//pointer arithmetic on an array is well defined
new (*sptr+1) std::string("second element");

1
Sadece (taslak) C ++ 20 standardı üzerinden bir arama yaptım ve dizileri "örtük ömür boyu türü" olarak tanımlayan hiçbir şey bulamadım (ve evet, varyasyonları aradım). Lütfen talebinizin daha ayrıntılı bir açıklamasını girin (örn. Standarttaki bölüm ve fıkra). Herhangi bir alakalı bağlamda, kaynağı bulamadan sorunuzu cevaplamak biraz zor.
Peter

1
@Peter: eel.is/c++draft/basic.types#9 , son cümle
Geza

PDF open-std.org/jtc1/sc22/wg21/docs/papers/2020/n4849.pdf (görünüşte en son çalışan taslak) bakıyordum ve bu cümleye bile sahip değil. Görünüşe göre "örtük ömür boyu" anlamını da bulmanız gerekecek. Bağlantınızın yayınlanmış çalışma taslaklarına bile girmemiş olan bazı "devam eden düzenlemeler" almış olabileceğinden şüpheleniyorum.
Peter

1
@Peter Değişiklikler, P0593'ün son Prag toplantısından standartla birleştirilmesinin sonucudur . Henüz ortaya çıkan taslağı henüz yayınlamadılar, ancak bu taahhütte birleştirilmiş ifadeleri görebilirsiniz .
ceviz

Yanıtlar:


3

Örtük olmayan bir ömür boyu türüne ilişkin bir dizi dolaylı olarak oluşturulabileceği anlamına mı geliyor?

Evet.

Örtülü bir dizinin oluşturulması dizinin öğelerinin oluşturulmasına neden olmaz mı?

Evet.

std::vectorSıradan C ++ ' da uygulanabilir kılan budur .


Ömrünün std::launder(static_cast<std::string*>(ptr))ömrü içinde olmadığı için dizinin ilk öğesine std::launder(static_cast<std::string(*)[10]>(ptr))bir işaretçi döndürmediğini , ancak dizi ömrünün içinde olduğu için diziye bir işaretçi döndürdüğünü de onaylayabilir misiniz ?
Oliv

Bu benim için doğru görünüyor.
TC

@Oliv Ve std::launderaslında gerekli olmadığını varsayalım , çünkü eel.is/c++draft/intro.object#11ptr zaten diziyi işaret edecek garantiler ?
Ceviz

@ ceviz, bunu özledim. Bir Yani static_castiçin std::string (*) [10]yeterli olmalıdır! tx.
Oliv

@Oliv Ama sanırım soru o zaman ilk örneğinizin std::launderiyi tanımlanıp tanımlanmayacağı olur. Gösterilecek bir std::stringnesne yoktur , ancak ptrdiziyi gösterebilir, böylece statik döküm değeri değişmeden bırakır sptrve diziyi de işaret eder. Onunla std::launderUB sadece std::laundergereksinimleri nedeniyle .
ceviz
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.