このコードは未定義た行動:std :: string_view :: dataにヌルターミネータが含まれていないのはなぜですか?
#include <experimental/string_view>
#include <iostream>
using namespace std::experimental::string_view_literals;
void foo(std::experimental::string_view msg) {
std::cout << msg.data() << '\n'; // undefined behavior if 'msg' is not null-
// terminated
// std::cout << msg << '\n'; is not undefined because operator<< uses
// iterators to print 'msg', but that's not the point
}
int main() {
foo("hello"sv); // not null-terminated - undefined behavior
foo("foo"); // same, even more dangerous
}
std::string_view
は、文字列を終了null以外を格納できるということである、とdata
を呼び出すときに、ヌルターミネータが含まれていない理由。すなわち、上記のコード定義された動作を行うこととして、本当に限界だ、私はそれのうちstd::string
を構築する必要があります。
std::string str{ msg };
std::cout << str.data() << '\n';
これは本当に、この場合にstd::string_view
が不要になり、私はまだfoo
に渡された文字列をコピーする必要があり、移動セマンティクスを使用してmsg
をstd::string
に変更するのはなぜですか?これはもっと速いかもしれませんが、私は測定しませんでした。私はconst char*
を受け入れる関数にconst char*
を渡すたびに少し不要ですが、委員会はそれをこのように決めた理由がなければならないstd::string
を構築する必要が
いずれかの方法、。
なぜ、std::string_view::data
は、std::string::data
のようなヌル終了文字列を返さないのですか?
のErrが、*文字列リテラル*がnullで終了します。 – WhiZTiM
@WhiZTiMどういう意味ですか? – Rakete1111
私は、あなたがなぜnullを終了するために 'data'を必要とするのか見当たりません。ヌルで終了した 'const char *'を与えても、ビューはそれを保持します。あなたは1つを持っていない場合、ビューは1つを追加しません。それはIMHOの期待行動です。 – NathanOliver