Re: How is common_type (N2615) supposed to work?
Bo Persson ha scritto:
From the proposal for new time classes (N2615)
http://www.open-std.org/jtc1/sc22/WG21/docs/papers/2008/n2615.html#common_type
I get this common_type traits
template <class ...T> struct common_type;
template <class T>
struct common_type<T>
{
typedef T type;
};
template <class T, class U>
struct common_type<T, U>
{
private:
static T&& t();
static U&& u();
public:
typedef decltype(true ? t() : u()) type;
};
Using gcc 4.3.1, which is the only compiler I have that compiles it, I
tried this simple code:typedef common_type<int>::type one;typedef
common_type<int, int>::type two;The compiler seems to agree with me
that 'one' is a typedef for 'int' while 'two' is a typedef for
'int&&'. Why is that? Is that useful?Bo Persson
I believe it's a bug in gcc. According to my interpretation of clause 5,
paragraph 6, the type of the expression "true ? t() : u()" cannot be a
reference. In fact, the types of t() and u(), which are T&& and U&&, are
"adjusted" to T and U "prior to any further analysis". Because of this
adjustment the argument of the conditional operator are simple rvalues
(not rvalue-references!) and there is nothing in 5.16 that might
re-introduce the && in the final type. (Before objecting to this
interpretation, please be aware of the subtle but fundamental difference
between rvalue and rvalue-reference.)
If my interpretation is correct, common_type<int, int>::type is just
int, as expected.
Ganesh
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]