私は小さなプロジェクトに取り組んでいて、次のような状況になりました。
_std::string myString;
#GetValue() returns a char*
myString = myObject.GetValue();
_
私の質問は、GetValue()
がNULLを返すかどうかですmyString
は空の文字列になりますか?未定義ですか?またはそれはセグメンテーション違反になりますか?
興味深い小さな質問。 C++ 11標準によると、宗派。 21.4.2.9、
basic_string(const charT* s, const Allocator& a = Allocator());
必須:sはnullポインタであってはなりません。
この特定の要件が満たされない場合、標準はライブラリに例外をスローするように要求しないため、nullポインタを渡すと未定義の動作が引き起こされたように見えます。
ランタイムエラーです。
これを行う必要があります:
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
に変換されます。
私の質問は、GetValue()がNULLを返すかどうかです。myStringは空の文字列になりますか?未定義ですか?またはそれはセグメンテーション違反になりますか?
これは未定義の動作です。コンパイラーとランタイムは、必要なことを何でも実行でき、それでも準拠できます。