Участник
главное когда какой-нибудь потенциально нулевой конст чар заворачиваешь, не забывай нуллптр чекать. стандарт требует чтобы в конструктор string_view передавался валидный, не нуллптр, указатель(то есть ответственность за проверку указателя лежит на тебе)Да... звучит убедительно. Ну, видимо настало время мне ебейшую кучу кода переписать и перестать уже быть консерватором.
Энивей, спасибо за развернутый ответ. Теперь я понял, о чем ты.
UPD: Справебыдлости ради, я видимо просто не очень понимал, как все эти новые приколы работают.
Почитал документацию щас. Да, штука крутая, глупо её не юзать.
типичный пример заворачивания конст чара(например из какого-нибудь класса) в стрингвью:
C++:
std::string_view CGameEvent::GetName()//c++17
{
if(name_ptr_const_char)
return {name_ptr_const_char};
return {};//нельзя из нуллптр конструировать, пустой возвращай если нуллптр
}
C++:
constexpr std::string_view MakeStringView(const char* ptr) noexcept
{
if (ptr)
return { ptr };
return {};
}
std::string_view CGameEvent::GetName() { return MakeStringView(name_ptr_const_char); }
C++:
#include <iostream>
constexpr std::string_view MakeStringView(const char* ptr) noexcept
{
if (ptr)//comment check = crash
return { ptr };
return {};
}
class Shit
{
const char* x{ nullptr };
public:
Shit(const char* _x) : x{ _x } {}
std::string_view GetName() const noexcept;
};
std::string_view Shit::GetName() const noexcept { return MakeStringView(x); }
int main()
{
Shit a{ nullptr }; std::cout << a.GetName() << std::endl;
Shit b{ nullptr }; std::cout << b.GetName() << std::endl;
Shit c{ nullptr }; std::cout << c.GetName() << std::endl;
Shit d{ "d"}; std::cout << d.GetName() << std::endl;
Shit e{ "e" }; std::cout << e.GetName() << std::endl;
Shit f{ "f" }; std::cout << f.GetName() << std::endl;
Shit g{ nullptr }; std::cout << g.GetName() << std::endl;
Shit h{ "h" }; std::cout << h.GetName() << std::endl;
Shit i{ "f" }; std::cout << i.GetName() << std::endl;
Shit j{ nullptr }; std::cout << j.GetName() << std::endl;
return 0;
}