web-dev-qa-db-ja.com

nullptrをstd :: stringとして返すとコンパイル時エラーにならないのはなぜですか?

バグが原因で、このコードがVisual Studio 17で正常にコンパイルされ、おそらく他のコンパイラでも同様にコンパイルされることがわかりました。なぜ私は興味がありますか?

#include <iostream>
#include <string>

std::string foo(){
    return nullptr;
}

int main(){
    auto s = foo();
    std::cout << s << std::endl;
}

std::basic_string c'torがchar*で呼び出される可能性があり、ptrからstd::stringへの暗黙の変換を返すときに(NULLを引数として)そして、それが不幸になります)。私は正しい道を進んでいますか?

24
Taron

はい、あなたの仮定は正しいです。チェック _std::basic_string_コンストラクタ#5 が呼び出されます:

_basic_string( const CharT* s,
              const Allocator& alloc = Allocator() );
_

nullptrを渡すと、 標準 と注記に記載されているように、未定義の動作が呼び出されることに注意してください。

[s, s + Traits::length(s))が有効な範囲でない場合の動作は定義されていません(、たとえばsがnullポインターの場合 )。

24

なぜコンパイルしないのですか? std::stringには次のコンストラクタがあります:

string(const CharT* s, const Allocator& alloc = Allocator());

これは、sが指すnullで終了する文字列のコピーで初期化された内容で文字列を構築します。コンストラクタはnot明示的であるため、nullptrからstd::stringへの暗黙的な変換は実際に可能です。

13
Evg