2011-01-26 1 views
5

私のコードでは、を使用する代わりにstd::stringオブジェクトを初期化する代わりに、私は(これはboolです)とタイプしました。これでコンパイルエラーは報告されませんでした。しかし、後で私のコードでは、この文字列オブジェクトが使用されているとき、私はstd::logic_errorを実行時に取得します。誰も説明してください、なぜこのコンストラクションが許可されたのですか(そうでなければ、私はコンパイルエラーを受け取り、問題を見つけましたか?これを実行している間、私が得る文字列オブジェクトを作成するためにブール値を使用するときに、どのような型変換が行われていますか?

#include <iostream> 

int main() 
{ 

    std::string str = false; 

    std::cout << str << "\n"; 

} 

O/P - - ここで

は小さなスニペットです

[email protected]~/MYBACKUP=>g++ -o test_string -g test_string.cxx 

[email protected]~/MYBACKUP=>./test_string 

terminate called after throwing an instance of 'std::logic_error' 
    what(): basic_string::_S_construct NULL not valid 
Aborted 

答えて

8

std::string NULLで終わる文字列へのconst char*を取るコンストラクタを持っています。

falseは、0の値を持つ整数定数式であるため、NULLポインタ定数として使用できます。したがって、このstd::stringコンストラクタが使用されます。

このコンストラクタにNULLポインタを渡すと、未定義の動作が発生します。あなたの標準ライブラリの実装は、std::stringコンストラクタの制約に違反したことを知らせるために、NULLポインタを渡してlogic_error例外を生成することによって、ここで助けます。他の実装はそれほど役に立たないかもしれません(あなたはすぐにクラッシュしたり、データが破損したり、誰が何を知っているか)。

+0

okです。しかし、これはコンパイル時のエラーに終わってはいけませんか? (実行時にエラーを後でキャッチする代わりに) – anindita

+1

@anindita:いいえ 'false'はヌルポインタ定数として使用できます(' #include 'の場合は' 0'または 'NULL'と同じです)とヌルポインタ定数は 'const char *'として使うことができるので、 'const char *'をとる 'std :: string'コンストラクタを使うことができます。 –

+0

ok ...説明をありがとう。 – anindita

関連する問題