web-dev-qa-db-ja.com

nullptrをstd :: stringに割り当てても安全ですか?

私は小さなプロジェクトに取り組んでいて、次のような状況になりました。

_std::string myString;
#GetValue() returns a char*
myString = myObject.GetValue();
_

私の質問は、GetValue()がNULLを返すかどうかですmyStringは空の文字列になりますか?未定義ですか?またはそれはセグメンテーション違反になりますか?

24
bardes

興味深い小さな質問。 C++ 11標準によると、宗派。 21.4.2.9、

basic_string(const charT* s, const Allocator& a = Allocator());

必須:sはnullポインタであってはなりません。

この特定の要件が満たされない場合、標準はライブラリに例外をスローするように要求しないため、nullポインタを渡すと未定義の動作が引き起こされたように見えます。

50
thb

ランタイムエラーです。

これを行う必要があります:

myString = ValueOrEmpty(myObject.GetValue());

ここで、ValueOrEmptyは次のように定義されます。

std::string ValueOrEmpty(const char* s)
{
    return s == nullptr ? std::string() : s;
}

または、const char*を返すこともできます(より理にかなっています):

const char* ValueOrEmpty(const char* s)
{
    return s == nullptr ? "" : s; 
}

const char*を返すと、呼び出しサイトでstd::stringに変換されます。

10
Nawaz

私の質問は、GetValue()がNULLを返すかどうかです。myStringは空の文字列になりますか?未定義ですか?またはそれはセグメンテーション違反になりますか?

これは未定義の動作です。コンパイラーとランタイムは、必要なことを何でも実行でき、それでも準拠できます。

5
David Hammen