boostorg / proto

Boost.org proto module
http://boost.org/libs/proto
21 stars 38 forks source link

Lazy functions make_expr() intended behaviour ? #10

Open preejackie opened 5 years ago

preejackie commented 5 years ago

Hi

using namespace boost;
template<int Exp>
struct pow_fuc
{
    using result_type = double;
    result_type operator()()
    {
        return std::pow(2,Exp);
    }
};
template<int Exp,typename Arg>
typename proto::result_of::make_expr <proto::tag::function,
                                      pow_fuc<Exp>,
                                      const Arg&>::type
pow(const Arg& c)
{
  return proto::make_expr<proto::tag::function>(pow_fuc<Exp>(),boost::ref(c));
}
int main()
{
    auto pi = proto::lit(3.17);
    pow<3>(pi);
    return 0;
}

The function call operator of pow_fuc doesn't receive any arguments, but while constructing the expression node for pow function, I'm passing the argument to the function call operator

  return proto::make_expr<proto::tag::function>(pow_fuc<Exp>(),boost::ref(c));  

My compiler doesn't throws any error messages and compiles fine. I don't know exactly whether this is the intended behaviour of proto. If it is a expected behaviour why it is so ? I'm believing that child expr nodes are captured by reference and used as the argument for pow_fuc call operator. Whether my assumption is wrong ? If wrong, Can you please explain me Thank you very much :)