Boost logo

Boost :

From: Eric Niebler (eric_at_[hidden])
Date: 2005-12-17 13:17:34

Thorsten Ottosen wrote:
> Eric Niebler wrote:
>>Here's my latest attempt. This works on gcc 3.4.4 (cygwin), but not on
>>VC7.1 or (sadly) Comeau Online. Language lawyers, start your engines!
> Eric, this is very cool :-)
> I tried to simplify it a little:
> template<typename T>
> struct probe
> {
> operator T ();
> operator T&() const;
> };
> template<typename T>
> char is_volatile( const T& );
> template<typename T>
> double is_volatile( T& );
> That gave the same results.

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, 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. :-)

> Then I did
> > template<typename T>
> > probe<T> make_probe(T const &);
> template<typename T>
> const probe<T> make_probe(T const &);
> Now it works on vc7.1 too. Not como.

Whoa. If the probe is const-qualified, how can the non-const member ever
get called on it? Seems like you've found a compiler bug. I would test
with Comeau Online, but it's not responding at the moment.

Anyway, getting this to work with vc7.1 is a major advance. Thanks.

> I'm not a language specialist and my understanding of ?: comes mainly
> from your article. That said, I find the solution very intuitive.

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.

Eric Niebler
Boost Consulting

Boost list run by bdawes at, gregod at, cpdaniel at, john at