0

次のコードが機能しないことはわかっており、その理由も完全に理解しています。私が実際に理解していないのは、なぜそうでないのかです:

int main(int argc, char *argv[]) {
    std::cout << (atoi(argv[1]) ? "foo" : 'b') << std::end;
}

理由: もちろん、この式は文字列または整数のいずれかを生成する可能性があり、これがコンパイラによって指摘されたエラーです。

error: operands to ?: have different types ‘const char*’ and ‘char’

理由: はとoperator<<の両方の型にバインドされているため、コンパイラがテンプレートのようにコード展開を実行しないのはなぜですか。これが実行されると思います。const char*char

たとえば、私が持っていた場合:

template <class T>
void a(const T& value) {
    std::cout << a << std::endl;
}

a("foo")私はどちらかを呼び出すことができa('b')、そして-私が推測する-コンパイラは、型名で関数の1つの展開を行い[T = const char*]、別の展開を[T = char].

これは、C++ が何を行い、何を行わないかという単純な問題かもしれませんが、展開が実行された場合にエラーとして表示されるコーナー ケースがあるかどうかはわかりません。

4

3 に答える 3

3

またはとは関係ありませcoutoperator <<。表現

atoi(argv[1]) ? "foo" : 'b'

それ自体はコンパイルされません。フィード先の 2 番目と 3 番目の演算子は?:、同じ型であるか、相互に暗黙的に変換可能な型である必要があります。

于 2013-04-07T13:33:46.387 に答える