http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54348
--- Comment #9 from Jonathan Wakely <redi at gcc dot gnu.org> 2012-08-22
07:37:18 UTC ---
(In reply to comment #5)
> strct s struct_strct( items, myItems, name, myName ) ;
> }
> </code>
>
> This works!
Only because NULL can be converted to std::string - but it would crash at
runtime if that branch was taken.
(In reply to comment #7)
> > void f()
> > {
> > false ? a : b;
> > }
>
> but this is not the same. surely ? the above is not a valid statement -
It's exactly the same. It's not valid because the types are incompatible, just
like your example. e.g. this is fine:
false ? a : a;
> I was saying:
>
> some_type some_object = false ? a : b;
As I said previously, the fact the conditional expression is used as an
initializer is irrelevant to the error.
(In reply to comment #8)
> All I'm suggesting is that g++ should try to find the most basic error,
Exactly. And the error is in the conditional expression, it has nothing to do
with the object being initialized.
> which is that different type objects are returned as the result of a
> conditional expression, and not "no match for ternary 'operator?:'" -
> what does this mean, it was searching namespace std:: for string::operator::?:
> ?
> then this succeeded, and it found it could not apply it because the types
> were different - shouldn't it complain about the root cause, that the types
> were different, rather than the symptom of not being able to satisfy
> operator std::string::?:() ?
It *is* complaining that the types are different (just not very clearly.)
The error has nothing to do with the type being initialized.
Here's a simpler form of your original which might convince you of that:
#include <string>
#include <list>
using namespace std;
void f()
{
list <string> myItems;
string myName;
false ? myItems : myName;
}
This still gives the same error. Understand now?