2017-11-16 19 views
4

私はdocumentation for std::string_viewを読んでいた、と私は、これらがコンストラクタだったことに気づい:std :: string_viewのテンプレートコンストラクタがないのはなぜですか?

constexpr basic_string_view() noexcept; 
constexpr basic_string_view(const basic_string_view& other) noexcept = default; 
constexpr basic_string_view(const CharT* s, size_type count); 
constexpr basic_string_view(const CharT* s); 

彼らはこの1つを導入していなかったのはなぜ?

template<std::size_t n> 
constexpr basic_string_view(const CharT(&s)[n]) : basic_string_view(s, n) {} 

大部分の場合、strlen()へのコールを保存します。導入されていない理由はありますか?

+4

私は想像します[これはそれと関係があります](https://stackoverflow.com/questions/28243371/why-does-pointer-decay-take-priority-over-a-auduced-template)。 – StoryTeller

+0

^^私はデュプリとして閉じ込めたい、YMMVです。 – Barry

+1

@バリー - 私はあなたよりも速くそれにリンクすることができたことに驚いています: – StoryTeller

答えて

2

理由は、それが機能的に同等ではないということです

char x[255]; 
sprintf(x, "hello folks"); 

// oops, sv.size() == 255! 
std::string_view sv(x); 

場合は多くのコンパイラは、strlenへのコールの意味を「知っている」と定数に置き換えるので、strlen事は、問題ではありません引数は定数です(string_viewコンストラクタをインライン化した後、引数は文字列リテラルになりますので、std::string_view sv("hello folks")が効率的です)。

関連する問題