1

私はStroustrupの本、オーバーロードと関連する曖昧さに関するセクションを読んでいます。

次のような例があります。

void f1(char);
void f1(long);

void k(int i)
{
    f1(i);    //ambiguous: f1(char) or f1(long)
}

コメントが述べているように、呼び出しはあいまいです。なんで?

この本の前のセクションでは、仮パラメータと実際のパラメータの一致に基づく 5 つのルールについて説明しました。では、上記の関数呼び出しは「プロモーション」に関するルール 2 に該当するのではないでしょうか? 私の推測では、'i' は long に昇格する必要があり、それで終わりです。

コメントによると、int から char への変換 (降格?) もルール 2 に該当するようです。

4

2 に答える 2

6

上記の int からの移動は、もはやプロモーションではありません。int 未満から int への移行は昇格です (まれなケースを除きます - 以下を参照してください)。

したがって、次のように変更すると、あいまいさがなくなり、最初のものを選択します

void f1(int);
void f1(long);

void k(unsigned short i) {
    f1(i);
}

intこれは、 のすべての値を格納できるプラットフォームでのみ当てはまることに注意してくださいunsigned short。そうでないプラットフォームでは、これはプロモーションではなく、呼び出しがあいまいになります。そのようなプラットフォームでは、タイプunsigned intが昇格の対象になります。

浮動小数点でも同じようなことが起こります。への変換は昇進ですが、へfloatは昇進ではありません。この場合、C++ は C とは異なり、toも同様に昇格します (ただし、オーバーロードはありません)。doubledoublelong doubledoublelong double

于 2010-06-26T13:18:27.697 に答える
0

int は char に変換でき、int は long にも変換できます。

したがって、コンパイラはどちらを呼び出しているかを判断できないため、その意味ではあいまいです。

于 2010-06-26T13:18:03.483 に答える