This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
Re: std::pair<reference,reference>
- From: Theodore Papadopoulo <Theodore dot Papadopoulo at sophia dot inria dot fr>
- To: Benjamin Kosnik <bkoz at redhat dot com>
- Cc: libstdc++ at gcc dot gnu dot org
- Date: Thu, 18 May 2006 12:08:11 +0200
- Subject: Re: std::pair<reference,reference>
- References: <1147801627.5952.10.camel@samoa> <20060518002156.98146bc9.bkoz@redhat.com>
- Reply-to: Theodore dot Papadopoulo at sophia dot inria dot fr
On Thu, 2006-05-18 at 00:21 -0500, Benjamin Kosnik wrote:
> > I wonder whether it would be possible to add some specializations of
> > pair for it to work even one of its template arguments is a reference.
> > Below is the specialization example for the case when the two
> > parameters are references. Obviously, DR 106 (if/when
> > adopted/implemented) is a better fix, but in the meantime, maybe a awful
> > trick like this one could be considered as a quality of
> > implementation....
>
> Hmm. Are you sure you have the right number?
I'm not sure I understand. You mean about DR 106. It looked like it but
I may be wrong...
It's about the langage forbidding to take references of references.
> include <utility>
>
> int main()
> {
> using namespace std;
>
> int i = 6;
> int j = 7;
> int& r1 = i;
> int& r2 = j;
> make_pair(r1, r2);
> pair<r1, r2> p;
> }
>
> %g++ -c pair.cc
> pair.cc: In function 'int main()':
> pair.cc:12: error: 'r1' cannot appear in a constant-expression
> pair.cc:12: error: 'r2' cannot appear in a constant-expression
> pair.cc:12: error: template argument 1 is invalid
> pair.cc:12: error: template argument 2 is invalid
> pair.cc:12: error: invalid type in declaration before ';' token
>
> This, you mean?
No I mean this:
#include <utility>
int main()
{
using namespace std;
int i = 6;
int j = 7;
int& r1 = i;
int& r2 = j;
pair<int&, int&> p = make_pair(r1, r2);
}
samoa-> g++ toto.c
/usr/lib/gcc/i386-redhat-linux/3.4.4/../../../../include/c+
+/3.4.4/bits/stl_pair.h: In instantiation of `std::pair<int&, int&>':
toto.c:11: instantiated from here
/usr/lib/gcc/i386-redhat-linux/3.4.4/../../../../include/c+
+/3.4.4/bits/stl_pair.h:85: error: forming reference to reference type
`int&'
/usr/lib/gcc/i386-redhat-linux/3.4.4/../../../../include/c+
+/3.4.4/bits/stl_pair.h: In constructor `std::pair<_T1, _T2>::pair(const
std::pair<_U1, _U2>&) [with _U1 = int, _U2 = int, _T1 = int&, _T2 =
int&]':
toto.c:11: instantiated from here
/usr/lib/gcc/i386-redhat-linux/3.4.4/../../../../include/c+
+/3.4.4/bits/stl_pair.h:90: error: invalid initialization of reference
of type 'int&' from expression of type 'const int'
/usr/lib/gcc/i386-redhat-linux/3.4.4/../../../../include/c+
+/3.4.4/bits/stl_pair.h:90: error: invalid initialization of reference
of type 'int&' from expression of type 'const int'
> > If acceptable, I would be glad to implement and test it.
> Sure.
I'll do that...