次のコードが機能しないことはわかっており、その理由も完全に理解しています。私が実際に理解していないのは、なぜそうでないのかです:
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++ が何を行い、何を行わないかという単純な問題かもしれませんが、展開が実行された場合にエラーとして表示されるコーナー ケースがあるかどうかはわかりません。