Как висящий указатель выводится в string_view? - PullRequest
0 голосов
/ 08 апреля 2020

Эта ссылка гласит, что во втором примере создается висячий указатель. Как висящий указатель создается во втором выражении, а не в первом?

std::string_view good("a string literal");   // OK: "good" points to a static array
std::string_view bad("a temporary string"s); // "bad" holds a dangling pointer

Кроме того, что представляет собой символ s после строки?

Ответы [ 2 ]

3 голосов
/ 08 апреля 2020

В s существует пользовательский литеральный оператор , который выдает std::string.

Разница между двумя строками заключается в том, что good one - это string_view, указывающий на строковый литерал, а строковые литералы имеют время жизни c (они сохраняются для всей проблемы). bad - это string_view, указывающий на временный string, и этот временный владеет своими данными - поэтому, когда временный уничтожается (в конце строки), он забирает свои данные с собой, и мы в конечном итоге с bad, указывающим на уничтоженную память.

3 голосов
/ 08 апреля 2020

s создает временный std::string из строкового литерала. Как только выполнение достигает точки с запятой, временное уничтожается, и в std::string.

остается висячий указатель. L перед строковым литералом создает широкую строку. Обычно это UTF-16 (Windows) или UTF-32 (Linux).

...