3
#include <iostream>
#include <typeinfo>

using namespace std;

int main()
{
    int s = 2;
    unsigned int u = 3;

    auto k = s + u;

    if (typeid(k) == typeid(s))
        cout << "signed" << endl;
    else if (typeid(k) == typeid(u))
        cout << "unsigned" << endl;
    else
        cout << "error" << endl;
}

GCC によるこのプログラムの出力は次のとおりです。

unsigned

これは未定義または実装定義の動作であると確信していますが、ドットを標準と結び付けることができないようです。

標準のどこにこれが書かれているのか教えていただけますか?

4

1 に答える 1

11

表示されているのは、通常の算術変換の効果だけです。

規格は次のように述べています。

§5 [expr] p7

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

  • [...]
  • それ以外の場合、積分昇格(4.5)は両方のオペランドで実行されます。次に、次のルールがプロモートされたオペランドに適用されます。
    • [...]
    • それ以外の場合は、両方のオペランドが、符号付き整数型のオペランドの型に対応する符号なし整数型に変換されます。
于 2013-03-09T19:18:46.843 に答える