Комитет по стандартам C++ имел возможность сделать код более безопасным с помощью string_view, но они решили добавить неявное преобразование из basic_string в basic_string_view.
Так эффективно они говорят это
// No worries, everyone always reads the docs...
struct Foo{
string_view sv;
//I really want to make this constexpr
constexpr Foo(string_view sv):sv(sv){}
};
/* ...some Friday afternoon... */
string s{"Looks like it works"};
Foo f{s + "..."};
менее важно, чем это
string f{"foo"};
string_view b{"bar"};
i_wonder(f == b);
//glad I didn't have to type static_cast<string_view>(f)!!
Скажите, пожалуйста, есть ли веские причины для неявного преобразования из basic_string в basic_string_view.
Хуже всего то, что вам нужен string_view, чтобы использовать constexpr (я знаю, или char*...)
ОБНОВЛЕНИЕ: этот вопрос был отложен, поскольку он не соответствует рекомендациям SO. Справедливо. Я думаю, что это то, что нужно подчеркнуть. Я думаю, что это неявное преобразование — шаг назад. Я начинаю видеть, как люди (даже очень опытные люди) пишут оборванные указатели из-за этого, как будто сейчас 90-е.
Каковы наилучшие методы использования string_view, в частности, WRT риска неявного преобразования от владельца к не-владельцу? Вечная бдительность не ответ.
Я должен сказать, что очень удивлен тем, как мало людей здесь заботятся о безопасности типов. Это повторяющаяся цель «современного» C++.
&
иconst &
, но не для&&
. - person Mooing Duck   schedule 22.05.2018const &
, то сработает и для&&
. - person Daniel H   schedule 22.05.2018_view
так же, как они относятся к&
. - person Daniel H   schedule 22.05.2018=delete
; если вы этого не сделаете, он вернется к конструкторуconst&
. - person Daniel H   schedule 22.05.2018operator std::string_view() const &&
(=delete
был бы хорошим кандидатом). Неявное преобразование по-прежнему будет работать для невременных объектов, но вы не закончите тем, что создадитеstring_view
для объекта, который будет уничтожен после завершения конструктора. - person monkey0506   schedule 22.05.2018foo(bar())
с учетомvoid foo(string_view)
иstring bar()
не будет компилироваться, и это наверняка вызовет жалобы на эргономику (отсутствие) C++. :-] - person ildjarn   schedule 22.05.2018