3

今日、値を bool にキャストすることは一種の魔法であることに気付きました。

int value = 0x100;
unsigned char uc = static_cast<unsigned char>(value);
bool b = static_cast<bool>(value);

sizeof(uc)sizeof(b)returnの両方1ucLSB のみがコピーされるため、0x00 が含まれることはわかっています。しかし、bになるtrueので、私の仮定は、にキャストするboolと、値がコピーされるのではなく評価されるということです。

この仮定は正しいですか?これは標準的な C++ の動作ですか?

4

6 に答える 6

10

それについて魔法は何もありません。intからへの変換は(8 ビットs の場合)unsigned charとして定義されているため、それが得られます。LSB をコピーして実装することもできますが、実装ではなく、セマンティックな意味で考える必要があります。value % 256char

int同じように、 からへの変換はboolとして定義されているvalue != 0ため、これが得られます。

[conv.integral]整数 (およびブール) 変換は、およびの C++11 標準でカバーされてい[conv.bool]ます。C スタイルのキャストについては、 および を参照[expr.cast]してください[expr.static.cast]

于 2013-06-05T08:26:57.973 に答える
4

はい、にキャストするboolと、コピーではなく値が評価されます。

value実際、あなたの例では、 ではない限り0bになりますtrue

更新: C++ Primer第 5 版第 2.1.2 章からの引用:

When we assign one of the nonbool arithmetic types to a bool object, the result is false if the value is 0 and true otherwise.

于 2013-06-05T08:24:42.927 に答える
4

これは標準の一部です。

4.12 ブール変換 [conv.bool]

1 算術、スコープなし列挙、ポインター、またはメンバー型へのポインターの prvalue は、bool 型の prvalue に変換できます。ゼロ値、NULL ポインター値、または NULL メンバー ポインター値は false に変換されます。その他の値は true に変換されます。std::nullptr_t 型の prvalue は bool 型の prvalue に変換できます。結果の値は false です。

于 2013-06-05T08:29:03.060 に答える
3

C スタイルのキャストの規則によれば、(bool)valueは事実上static_cast. thenの最初のルールが適用されstatic_cast、一時的な "declared and initialized ... as by new_type Temp(expression);" の値、つまりbool Temp(value);. それは明確に定義されています:Temptrueiffvalue != 0です。はい、valueある意味で「評価」されています。

于 2013-06-05T08:31:03.483 に答える
0

ISO/IEC C++ 標準:

4.12 ブール変換 [conv.bool] 1 算術... 型の prvalue は bool 型の prvalue に変換できます。ゼロ値は... false に変換されます。その他の値は true に変換されます。

したがって、prvalueは値であるため、値は評価されると言うかもしれませんが、それは一種のプレオナスティックです。

于 2013-06-05T08:42:41.793 に答える