285просмотров
17 августа 2025 г.
Score: 314
Многим известно, что std::string можно создать из указателя на char (допустим из некой C-шной функции):
#include <iostream>
#include <string> static std::string str = "OK"; const char getStr() { return str.c_str();
} int main() { std::cout << "str: " << std::string(getStr()) << std::endl;
} Но что будет, если нам прилетит nullptr и мы передадим его в конструктор std::string?
const char* getStr() { return nullptr; //return str.c_str();
} Можно подумать, что создастся пустая строка. В конце концов, почему бы и нет, я бы например реализовала строку именно так. На самом же деле передавать nullptr в конструктор строки нельзя и в общем случае будет UB. На gcc у меня это приводит к std::logic_error. А вот на msvc уже будет Access violation reading location 0x0000000000000000. Ситуация немного прояснилась с выходом C++23. Создавать строку из nullptr более нельзя:
basic_string( std::nullptr_t ) = delete; // C++23
std::string s = nullptr; // нельзя
Хотя кажется, что проблему с возвратом nullptr это не решает.