[Bug c++/50025] [DR 1288] C++0x initialization syntax doesn't work for class members of reference type
redi at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Sun Sep 30 10:58:00 GMT 2012
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50025
Jonathan Wakely <redi at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Attachment #28188|0 |1
is obsolete| |
--- Comment #10 from Jonathan Wakely <redi at gcc dot gnu.org> 2012-09-30 10:58:18 UTC ---
Comment on attachment 28188
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=28188
Testcase for Bug "error: invalid initialization of non-const reference of type
‘std::istream&"
(In reply to comment #9)
> Created attachment 28188 [details]
> Testcase for Bug "error: invalid initialization of non-const reference of type
> ‘std::istream&"
>
> Mysterious compiler error in line 35 of the attached testcase (test1.cpp);
> marked there as "BUG":
>
> test1.cpp:35:45: error: invalid initialization of non-const reference of type
> ‘std::istream& {aka std::basic_istream<char>&}’ from an rvalue of type ‘void*’
That's not mysterious, and is not related to this bug report.
Your code can be reduced to:
struct Base {
operator void*() { return 0; }
};
struct Derived1 : Base { };
struct Derived2 : Base { };
Derived1 d1;
Derived2 d2;
Base& b = true ? d1 : d2;
The conditional expression cannot implicitly convert two objects of different
types to a common base class, so instead the conversion operator is used to
convert both types to void*
To force the behaviour you expect use an explicit cast on one operand:
istream& si = sfile.is_open() ? (std::istream&)sfile : sbuf;
More information about the Gcc-bugs
mailing list