Neden std :: span karşılaştırma işleçlerinden yoksundur?


10

Değil miydi std::spanalt bölgelere hafif referans olarak tasarlanmış std::vector/ std::array/ düz diziye ve benzeri? Ayrıca, API'larında tutarlı olmaları için karşılaştırma operatörleri içermemeli midir? Dışlamanın ardındaki neden neydi?

Not: Karşılaştırma operatörleri tarafından, ben de tamamı anlamında ( <, <=, ...) ya da uzay gemisi<=>


Harika bir soru IMO, ben de aynı şeyi merak ediyorum. operator==de eksik. Esp. vektör için genellikle doğrudan karşılaştırmayı uygun buluyorum. Emin olmamakla birlikte, belki de statik boyut açıklığı türlerindeki zorluklardan kaynaklanabilir.
Mayıs'ta darune

Görünüşe göre gsl :: span, hangi std :: span sürümüne sahip olduğu bunları da içermez.
Mart'ta

1
@DanielLangr neden sözlükbilimsel bir karşılaştırma std::vectorve std::arrayyapmıyoruz? Onlar zaten bu türler için tanımlanmıştır, neden burada olmasın.
Timo

2
O Not P0122R7 için karşılaştırma önermektedir span, ancak şu anki taslak standardı bunu içermez.
Daniel Langr

1
@darune gsl::span , karşılaştırma işleçlerine sahiptir (ve her zaman da öyleydi ). Onları sadece kendi başlıklarına
Barry

Yanıtlar:


3

Daniel Langr belirttiği gibi , std::spanilk öneri karşılaştırma operatörlerini vardır P0122 . Bu operatörler daha sonra çalışma taslağı N4791'den beri kaldırılır ve nedenleri P1085'te belirtilir .

Kısacası, kopyalama ve const std::span"sığ" (yani kopyalama a std::spantemel öğelerini kopyalamaz ve bir const std::spantemel öğelerinin değiştirilmesini engellemez), bu nedenle varsa karşılaştırmalar da "sığ" olmalıdır tutarlılık için.

Bu makale aşağıdaki örnekleri vermektedir:

Örnek 1:

T oldx = x;
change(x);
assert(oldx != x);
return oldx;

Örnek 2:

void read_only(const T & x);

void f()
{
  T tmp = x;
  read_only(x);
  assert(tmp == x);
}

Bu örneklerdeki iddialar, T = std::spannormal türler için geçerli değilse başarısız olabilir .

std::string_viewSığ kopyası olan ancak derin karşılaştırmalar olduğu iddia edilebilir . P1085'in bunun için bir açıklaması var:

string_viewBununla birlikte string_view, bu eşleşmeler işaret ettiği öğeleri değiştiremez ve bu nedenle sığ kopyasının string_viewyazma-kopyalama optimizasyonuna benzer olduğu düşünülebilir.


Hiçbir şey karakter dizisi sahibinin std::string_viewişaret ederken orijinal depolamayı değiştirmesini engellemez . Yani, diyelim ki, std::map<std::span<T>, U>kırılmış std::map<std::string_view, U>. IMHO, std::string_viewkarşılaştırma işleçleri de içermemelidir.
Mart'ta Lyberta 18:54
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.