
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 www.boost-consulting.com