Boost logo

Boost :

From: Eric Niebler (eric_at_[hidden])
Date: 2005-12-17 00:17:18

Eric Niebler wrote:
> Arkadiy Vertleyb wrote:
>>What is current state of the art on l-value/r-value detection? (I know Eric
>>made some progress in the past by using the "?" operator).
> It's an open question whether it's possible to do this in standard C++.
> If it's possible, I'd be very interested.

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!

template<typename T>
struct probe
     operator T ();
     operator T volatile const &() const;

template<typename T>
probe<T> make_probe(T const &);

template<typename T>
char is_volatile(T const &);

template<typename T>
double is_volatile(T const volatile &);

#define IS_RVALUE(x) \
     sizeof(char) == \

// tests
struct foo { foo() {} };
foo const make_foo() { return foo(); }

int main()
     int i;
     foo const f1;
     foo f2;

     char t1[!IS_RVALUE(f1)];
     char t2[!IS_RVALUE(f2)];
     char t3[IS_RVALUE(foo())];
     char t4[IS_RVALUE(make_foo())];
     char t5[!IS_RVALUE(i)];
     char t6[IS_RVALUE(1)];

     return 0;

Eric Niebler
Boost Consulting

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