16

要約:nullptrに変換しbool、 にbool変換するのにint、なぜ にnullptr変換しないのintですか?

このコードは問題ありません:

void f(bool);
f(nullptr);      // fine, nullptr converts to bool

そして、これは大丈夫です:

bool b;
int i(b);        // fine, bool converts to int

では、なぜこれは大丈夫ではないのでしょうか。

void f(int);
f(nullptr);      // why not convert nullptr to bool, then bool to int?
4

4 に答える 4

30

それはまさに の主なアイデアだからnullptrです。

nullptrこの動作を回避するためのものでした:

struct myclass {};

void f(myclass* a) { std::cout << "myclass\n"; }
void f(int a) { std::cout << "int\n"; }

// ...

f(NULL); // calls void f(int)

nullptrこの動作に変換可能な場合はint発生します。

問題は、「なぜ に変換できるの boolか?」ということです。

構文-「甘さ」:

int* a = nullptr;
if (a) {
}

これは、次のものよりもはるかに優れています。

if (a == nullptr) {
}
于 2012-10-26T18:20:02.707 に答える
18

標準の§4.1では、変換の実行方法について次のように述べています。

標準変換は、組み込みの意味を持つ暗黙的な変換です。条項 4 は、そのような変換の完全なセットを列挙します。標準変換シーケンスは、次の順序の標準変換のシーケンスです。

— 左辺値から右辺値への変換、配列からポインターへの変換、および関数からポインターへの変換のセットからのゼロまたは 1 つの変換。

— 次のセットからのゼロまたは 1 つの変換: 整数昇格、浮動小数点昇格、整数変換、浮動小数点変換、浮動整数変換、ポインター変換、ポインターからメンバーへの変換、およびブール変換。

— ゼロまたは 1 つの資格変換。

したがって、コンパイラは、任意に多くではなく、上記の各タイプの変換の一部、まったく、またはすべての「ゼロまたは 1 つの変換」のみを行います。そして、それは本当に良いことです

于 2012-10-26T18:21:42.520 に答える
2

なぜこれが起こっているのかを理解するには、 の使用方法を理解する必要がありますnullptr。以下のリンクを確認してください。

お役に立てば幸いです。

于 2012-10-26T18:34:50.223 に答える
0

keyworkd nullptrは、C NULLの複数の定義のために c++11 で導入され、int 引数と NULL を使用して関数をオーバーロードするときに混乱します。

#define NULL 0
#define NULL (void*)0

聖書の中で The C++ Programming Language (4th), page 270

ポインターから bool への変換は、条件では便利ですが、他の場所では混乱を招きます。

したがって、nullptr_t 変数の int への変換は、それが存在する理由であるため許可されていないと思いますが、bool 変数のようなテスト条件として使用できます。

于 2014-05-25T03:24:06.317 に答える