2017-11-28 58 views
1

真剣に、何が起こっていないのですか? std::stringからstd::string_viewへの暗黙的な変換があり、安全でないとはみなされません。プログラマが慎重でない場合、これは確かに多くの不自然な参照を引き起こすかもしれません。一方 std :: string_viewからstd :: stringへの変換は暗黙的です。委員会は何を考えましたか?

は、彼らが同じ引数が、全く逆の方法でを使用して std::stringから std::string_viewからの暗黙的な変換を却下している:プログラマが注意しないかもしれ ので。

それはそれは超混乱して骨までストリッピングしながら、彼らは生const char*ポインタの代替を作成したことを素敵だ:

  • 暗黙const char* - >std::stringOK
  • 暗黙std::string_view - >std::stringNOPE
  • 割り当てstd::string = const char*OK
  • 割り当てstd::string = std::string_viewOK
  • アペンドstd::string + = const char*OK
  • アペンドstd::string + = std::string_viewOK
  • 連結const char* + std::stringOK
  • 連結std::string_view + std::stringNOPE
  • 連結std::string + const char*OK
  • 連結std::string + std::string_view

は、私が何かをしないのですか、これは総ナンセンスであるNOPE?

結局のところ、この文字列ビューは、それをconst char*と似ている重要な部分をすべて持たないとどのくらい役に立ちますか?それを完全にするための最後のステップをしないうちに、stdlibの生態系にそれを統合することのポイントは何ですか?結局のところ、ストリングの一部を表すオブジェクトが必要な場合、私たち自身で作成することができます。実際には、数年前に既に多くの図書館が行っていました。何かを標準化することの重要なポイントは、それを幅広いユースケースに役立てることです。

C++ 2aでこれを修正しますか?

+4

これは疑問ではないので、私はこのトピックをオフトピックとして閉じるよう投票しています。これは暴言です。 – Barry

+0

これはおそらくhttps://www.reddit.com/r/cppに属しています(一部のC++委員がそれを読んでいます)。 –

答えて

0

問題がstd::string_viewということです - >std::string_viewない - 暗黙のstd::stringが一方>std::stringは、ヒープの割り当てを完全根底にあるメモリのコピーを、作ります。最初にstd::string_viewを使用するのに気にかけてしまった場合、明らかにコピーが気になるので、暗黙的に起こることは望ましくありません。

この例を考えてみましょう:

void foo1(const std::string& x) 
{ 
    foo2(x); 
} 
void foo2(std::string_view x) 
{ 
    foo3(x); 
} 
void foo3(const std::string& x) 
{ 
    // Use x... 
} 

foo2const std::string&パラメータを使用し、あなたがstd::stringない文字列を渡す場合は、より効率的であることをstd::string_viewので使用していたかもしれない機能。そこには驚きはありません。しかし、パラメータをconst std::string&と指定した場合よりも効率が悪いです!

  • foo2が(例えばfoo1によって)std::string引数で呼び出された場合:foo2コールfoo3が、それは文字列のコピーを作成します。それがconst std::string&引数を持っていれば、既に持っていたオブジェクトを使っていた可能性があります。
  • foo2const char*引数で呼び出された場合:std::stringコピーを早くまたはそれ以降に作成する必要があります。 const std::string&パラメータでは以前に作成されていますが、全体的にちょうど1つのコピーがあります。今

foo2を想像してはfoo3のような複数の機能を呼び出し、またはループ内foo3呼び出します。それはまったく同じstd::stringオブジェクトを繰り返し作成しています。コンパイラがこれについてあなたに通知したいと思うでしょう。

+0

私の経験から、std :: string_viewは文字列の解析を最適化するためによく使われます。構文解析の結果は、明らかにビューに格納することはできませんので、永続的な記憶域( 'std :: string')に転送する必要があります。なぜそれほど冗長でなければならないのですか?結局のところ、私は支配権を持っていますし、私は**ビュー*が変換されるかもしれない場所を知るべきです**。 – GreenScape

+0

あなたが書いていることは、悪いデザインです。コードの他の部分の悪いデザインは、 'std :: string_view'のデザインを悪くする理由にはならないはずです。また、 'foo1()'と 'foo3()' **を参照するプログラマは、変換について知っておくべきです。これをすべて無視すれば、明示的にどのように役立ちますか?デザインが悪いので、プログラマはまだ 'std :: string'を作成する必要がありますか? – GreenScape

+0

@GreenScape私はあなたの最初のコメントのポイントを理解していません。多分あなたの質問にいくつかのサンプルコードを追加することができますか?私はまたあなたの第2のポイントを本当に理解していません。正確に何が悪いデザインですか? 'foo3'が' const std :: string& 'をとるという事実?これは 'std :: string_view'が存在する前に非常に一般的でした。そのコードがたくさんあります。あるいは 'foo2'の実装ですか?私は同意するので(悪い実装でも悪い設計ではないが)、それは偶然にも簡単に起こる可能性があるので、コンパイラがそれをキャッチすることを望むだろう。 –

関連する問題