Search code examples
c++templatescompiler-constructiontyping

Expansion of types from comparison


I know the following code does not work, and I fully understand why. What I actually do not understand is why not:

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

Why: Of course, this expression may generate either a string or an integer, and this is the error pointed by the compiler:

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

Why not: Since the operator<< have a bind with both of the types const char* and char, why is it the compiler don't perform a code expansion as in a template -- which, I guess, is what is performed.

For example, if I had:

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

I could call either a("foo") and a('b'), and -- I guess -- the compiler would do one expansion of the function with the type name [T = const char*] and another one with [T = char].

This may be a simple matter of what C++ does -- and what it does not --, but I fail to see if there's any corner case that would come up as an error if the expansion was performed.


Solution

  • It has nothing to do with cout or operator <<. The expression

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

    itself wouldn't compile. The 2nd and 3rd operators that you feed to ?: must be either the same type, or types that are implicitly convertible to one other.