3

このコードがあるとしましょう。

#include <string>

int main()
{
    std::string(0);
    return 0;
}

書き込みのstd::string(0)結果、このコンストラクターへの引数としてstd::basic_string<char>::basic_string(const char*)呼び出され0ます。このコンストラクターは、引数をC文字列へのポインターとして処理しようとします。

このコードを実行すると、明らかstd::logic_errorにスローされます。しかし、私の質問はこれです:なぜGCCとMSVC 8.0の両方が警告を出さないのですか?「キャストなしで整数からポインタを作成する」という行に沿って何かが表示されることを期待しています。

4

2 に答える 2

9

0は値0の整数定数式であるため、nullポインタ定数です。ヌルポインタとして0値の定数を使用することは、キャストではありません。

C ++ 11ではnullptr(およびnullptr_t)が導入さ0れていますが、大量のコードがそれに依存しているため、nullポインターとしての扱いが近い将来変更される可能性はほとんどありません。

于 2012-11-15T09:03:23.277 に答える
1

それらのコンパイラはこの機能を見逃しているように見えるからです。機能レポートを作成することをお勧めします。

コンパイラは、std文字列クラスを内部で簡単に認識し、適切な警告を発することができます。

ただし、警告をキャストフリーの場合のみに制限する理由はわかりません。そこにキャストしたり、nullポインターを渡したりすることも、同様に無意味です。

于 2012-11-15T09:07:10.017 に答える