एक सहकर्मी यह लिखना चाहता था:
std::string_view strip_whitespace(std::string_view sv);
std::string line = "hello ";
line = strip_whitespace(line);
मैंने कहा कि वापसी string_view
ने मुझे एक प्राथमिकता दी है , और इसके अलावा, यहाँ अलियासिंग मुझे यूबी की तरह लग रहा था।
मैं निश्चितता के साथ कह सकता हूं कि line = strip_whitespace(line)
इस मामले में बराबर है line = std::string_view(line.data(), 5)
। मुझे विश्वास है कि वह कॉल करेगा string::operator=(const T&) [with T=string_view]
, जिसे इसके बराबर परिभाषित किया गया है line.assign(const T&) [with T=string_view]
, जिसे इसके समकक्ष परिभाषित किया गया है line.assign(line.data(), 5)
, जिसे ऐसा करने के लिए परिभाषित किया गया है:
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.
लेकिन जब अलियासिंग होता है तो यह नहीं कहता है।
मैंने कल कप्पलंग स्लैक पर यह प्रश्न पूछा और मिश्रित उत्तर मिले। सुपर आधिकारिक जवाबों की तलाश में, और / या वास्तविक पुस्तकालय विक्रेताओं के कार्यान्वयन का अनुभवजन्य विश्लेषण।
मैं परीक्षण मामलों लिखा था के लिए string::assign
, vector::assign
, deque::assign
, list::assign
, और forward_list::assign
।
- Libc ++ इन सभी परीक्षण मामलों को काम करता है।
- Libstdc ++ उन सभी को छोड़कर काम करता है
forward_list
, जो segfaults करते हैं। - मैं MSVC के पुस्तकालय के बारे में नहीं जानता।
Libstdc ++ में सीगफॉल्ट मुझे आशा देता है कि यह यूबी है; लेकिन मैं यह भी देखता हूं कि दोनों libc ++ और libstdc ++ इस काम को कम से कम आम मामलों में करने के लिए बहुत प्रयास कर रहे हैं।
*this
। लेकिन मुझे लगता है कि मौजूदा स्टोरेज को दोबारा इस्तेमाल होने से रोकने के लिए कुछ भी नहीं है, इस स्थिति में यह अनिर्दिष्ट हो जाता है, क्योंकि स्टोरेज को कॉपी-ओवर करने का शब्दार्थ अनिर्दिष्ट है।
assign
में आवश्यकताओं [: container.seq.req टैब] ।