web-dev-qa-db-ja.com

string_viewを文字列にstatic_castすることは合法ですか?

私の質問は、stackoverflow https://stackoverflow.com/a/48082010/5360439 に関するこの回答によって動機付けられています。引用するには

Q:_std::string_view_を_const char*_に変換するにはどうすればよいですか?

A:std::string(string_view_object).c_str()を実行して、ヌルで終了することが保証された一時的なコピーを取得します(行の最後でクリーンアップします)。

残念ながら、それは新しいstringを作成します。単にやってもいいのかと思っていますが、

_static_cast<string>(string_view_object).c_str()
_

今、私の質問は:

  1. これは新しい文字列を構築しますか?

  2. Nullで終了するcharシーケンスを返すことが保証されていますか?

デモ用の小さなコードがあります。正常に動作するようです。 (ワンドボックスを参照 results

_#include <string>
#include <iostream>
#include <string_view>
#include <cstring>

int main()
{
  std::string str{"0123456789"};
  std::string_view sv(str.c_str(), 5);

  std::cout << sv << std::endl;
  std::cout << static_cast<std::string>(sv) << std::endl;
  std::cout << strlen(static_cast<std::string>(sv).c_str()) << std::endl;
}
_
14
JohnKoch

static_cast<std::string>(sv)は、std::string::stringに変換可能なすべての型を期待するstd::string_viewコンストラクターを呼び出しています( 詳細 )。したがって、はい、まだ新しいstd::stringオブジェクトを作成しています。これにより、nullで終了する文字シーケンスが保証されます。

12
Mário Feroldi