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_viewbeni 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.
assignkoşulların ön koşul ihlali nedeniyle kesinlikle UB'dir .