Boost logo

Boost :

From: Thorsten Ottosen (tottosen_at_[hidden])
Date: 2005-12-18 09:04:03


Eric Niebler wrote:
> Thorsten Ottosen wrote:

> I noticed this too, and decided it was a bug in gcc. I think that given
>
> template<typename T> struct conv {
> operator T() { return T(); }
> };
> template<typename T> void bar(T&) {}
>
> the expression:
>
> typedef foo const cfoo;
> bar(true ? conv<foo>() : cfoo());
>
> should compile,

Even though bar takes a T& and not const T& parameter?

> and that in bar, T should be deduced at "foo const".
> With gcc, it does *not* compile because the expression "true ?
> conv<foo>() : cfoo()" appears to have the type "rvalue of foo" instead
> of "rvalue of foo const". gcc is inadvertantly dropping cv-modifiers
> where it shouldn't.
>
> But we're certainly free to use that to our advantage. :-)

sure.

> If we can make this work on the popular compilers, it'll be a big win
> for both boost.foreach and boost.typeof. It doesn't matter if we need to
> take advantage of compiler bugs to get it. I wonder if other compilers
> and other versions of gcc accept either my variant or yours.

Good question.

It seems to me that conversion operators are a poorly understood part of
the language. Maybe you should take this up on the reflector.

Another thing I find wierd is that this seems to lead to ambiguity:

template< class T >
struct probe
{
   operator T&();
   operator T();
};

int main()
{
        int i = probe<int>(); // error
        int& r = probe<int>(); // ok
}

If I add const to the T() conversion, it suddenly works ok again.

-Thorsten


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk