Tom Babbin wrote:
The problem is that proto::eval() takes its first argument by non-const reference. The temporary expression returned by pow1 doesn't bind to it as it's defined in the users' guide. Adding a const-qualification to the return type solves the problem.
I'll update the docs for 1.41. Thanks for the report.
Hi, Eric,
Thanks for the quick response. Adding a const does fix the problem. However, I am relatively new to meta programming. How come a const expression binds to the first argument of eval, while a non-const does not?
Consider this: template<class T> void foo(T &) {} struct S {}; S rvalue() { return S(); } S const const_rvalue() { return S(); } Now the following invocation fails: foo( rvalue() ); // error, non-const rvalue cannot // bind to an lvalue reference But the following invocation succeeds: foo( const_rvalue() ); // OK The reason is because in the second invocation, the template argument T is deduced to be "B const", and an rvalue can bind to a const lvalue reference. In the first invocation, T is deduced to "B" and an rvalue cannot bind to a non-const lvalue reference. HTH, -- Eric Niebler BoostPro Computing http://www.boostpro.com