9

私が以下を持っているとしましょうstruct

struct A
{
    unsigned int a : 1;
    unsigned int b : 1;
};

私が興味を持っているのは表現のタイプですa + b。技術的には、ビットフィールドにはサイズが小さい「タイプ」がありますが、intおそらく整数の昇格が発生するはずであり、結果はintたまたまgccとclangにあるようです。

しかし、ビットフィールド自体の正確なタイプを抽出することは不可能であり、常にその「大きな」タイプ (つまりunsigned int、この場合) であると推定されるため、整数昇格が発生するのは正しいでしょうか? ビットフィールドの正確な型とそのサイズについて実際に話すことはできないため、unsigned int整数昇格が発生しないように推測される場合を除きます。

(繰り返しになりますが、私の質問は、MSVC がたまたまそれunsigned intがそのような表現のタイプであると考えているという事実から生じています)

4

1 に答える 1

6

C++ 標準のドラフト: N4140セクション5に移動すると、次のように表示されます。

算術型または列挙型のオペランドを予期する多くの二項演算子は、同様の方法で変換を行い、結果の型を生成します。目的は、結果の型でもある共通の型を生成することです。このパターンは通常の算術変換と呼ばれ、次のように定義されます。

次の箇条書きが適用されます。

  • それ以外の場合、整数昇格 (4.5) が両方のオペランドで実行されるものとします。

そしてセクション4.5には次のように書かれています(強調鉱山):

整数ビットフィールド (9.6) の prvalue は、int がビットフィールドのすべての値を表すことができる場合、int 型の prvalue に変換できます。それ以外の場合、unsigned int がビットフィールドのすべての値を表すことができる場合は、unsigned int に変換できます。ビットフィールドがさらに大きい場合、整数昇格は適用されません。ビットフィールドに列挙型がある場合、プロモーション目的でその型の他の値として扱われます。

したがって、gcc と clang は正しく、int に昇格する必要がありますab

于 2015-09-11T17:36:39.327 に答える