Bir iş arkadaşı şunu yazmak istedi:
std::string_view strip_whitespace(std::string_view sv);
std::string line = "hello ";
line = strip_whitespace(line);
Ben dönen söyledi string_view
beni huzursuz yapılan önsel , ve dahası, örtüşme burada bana UB benziyordu.
line = strip_whitespace(line)
Bu durumda eşdeğer olduğunu kesin olarak söyleyebilirim line = std::string_view(line.data(), 5)
. Buna string::operator=(const T&) [with T=string_view]
eşdeğer olarak line.assign(const T&) [with T=string_view]
tanımlanan, eşdeğer olarak line.assign(line.data(), 5)
tanımlanan, bunu yapmak için tanımlanan çağrı yapacağına inanıyorum :
Preconditions: [s, s + n) is a valid range.
Effects: Replaces the string controlled by *this with a copy of the range [s, s + n).
Returns: *this.
Ancak bu, takma ad olduğunda ne olacağını söylemez.
Bu soruyu dün cpplang Slack'de sordum ve karışık cevaplar aldım. Burada süper yetkili yanıtlar ve / veya gerçek kütüphane satıcılarının uygulamalarının ampirik analizi aranıyor.
Ben test durumları yazdım için string::assign
, vector::assign
, deque::assign
, list::assign
, ve forward_list::assign
.
- Libc ++ bu test senaryolarının tümünü çalışır hale getirir.
- Libstdc ++
forward_list
, hangi segfaultlar hariç hepsini çalıştırır . - MSVC'nin kütüphanesini bilmiyorum.
Libstdc ++ içindeki segfault bana bunun UB olduğunu umut ediyor; ancak hem libc ++ hem de libstdc ++ 'ın en azından yaygın durumlarda bu işi yapmak için büyük çaba göstereceğini görüyorum.
*this
. Ancak, mevcut depolamanın yeniden kullanılmasını engelleyecek bir şey görmüyorum, bu durumda depolama alanı kopyalamanın anlambilimi belirtilmediğinden, bu belirtilmez.
assign
koşulların ön koşul ihlali nedeniyle kesinlikle UB'dir .