can't take const ref to tribool's indeterminate

Hi all,
The following does not compile (GCC 4.2):
#include

AMDG On 04/19/2011 12:27 AM, Phil Nash wrote:
The following does not compile (GCC 4.2):
#include
template<typename T> void byRef( const T& v ) { }
// ...
byRef( boost::indeterminate );
I realise that indeterminate is actually a function. If I write my own, equivalent, function I can substitute it here and it compiles, however. I can't see what is stopping it from working in indeterminate's case - but I suspect it is to do with some of the operator overloading going on. I couldn't pin it down, though.
A function type cannot be const qualified under C++03.
I can take it by value, of course.
What am I missing?
Before you ask - yes this is boiled down code. In my real situation I have generic code that doesn't even know about tribool, so I can't special-case it. And I'd rather get to the bottom of why it doesn't work for me - even if the end result is "you can't do that".
Probably the easiest solution is to have the call site use boost::tribool(boost::indeterminate). In Christ, Steven Watanabe

Thanks for you reply, Steven:
On Tue, Apr 19, 2011 at 4:36 PM, Steven Watanabe
AMDG
On 04/19/2011 12:27 AM, Phil Nash wrote:
The following does not compile (GCC 4.2):
#include
template<typename T> void byRef( const T& v ) { }
// ...
byRef( boost::indeterminate );
I realise that indeterminate is actually a function. If I write my own, equivalent, function I can substitute it here and it compiles, however. I can't see what is stopping it from working in indeterminate's case - but I suspect it is to do with some of the operator overloading going on. I couldn't pin it down, though.
A function type cannot be const qualified under C++03.
I suspected there might be something like this involved. What puzzles me still is that if I write my own function, I can pass it. e.g: inline bool myIndeterminate(boost::tribool x, boost::logic::detail::indeterminate_t) { return x.value == boost::tribool::indeterminate_value; } //... byRef( myIndeterminate ); And this compiles fine. Whether it should or not is another, not unimportant, matter - and what you've said suggests it shouldn't. Nonetheless why does my function compile when boost::indeterminate doesn't?
Probably the easiest solution is to have the call site use boost::tribool(boost::indeterminate).
It's a shame as it means that I can't treat indeterminate as a value because of the implementation choice. My actual function taking a const ref is an operator overload. It means that: myObject == boost::indeterminate doesn't compile even though: triboolValue == boost::indeterminate doesn't. It seems the forwarding problem is not the only obstacle to this sort of thing. Thanks and regards, [)o IhIL..
participants (2)
-
Phil Nash
-
Steven Watanabe