Opened 16 years ago

Closed 14 years ago

#781 closed Bugs (fixed)

Lambda: (_1 + "y")(string("x")) Doesn't Compile

Reported by: nobody Owned by: No-Maintainer
Milestone: Component: lambda
Version: None Severity: Problem
Keywords: Cc:

Description (last modified by Marshall Clow)

This program:

#include <iostream>
#include <ostream>
#include <string>
#include <boost/lambda/lambda.hpp>

int main() {
    const std::string s("Hello");

    std::cout << (boost::lambda::_1 + ", world!")(s) << std::endl;
}

fails to compile with Boost 1.33.1 (on GCC 3.4.2 and GCC 4.1.1, at least) due to at least two bugs.

One bug is in boost/lambda/detail/operators.hpp, lines 269-271. This function, declared to return a lambda_functor, returns a lambda_functor constructed from a tuple. But there is no such constructor. Instead, 'lambda_functor<' should be deleted from line 269 (and the closing '>' from line 271) so that it returns a lambda_functor_base constructed from a tuple. That constructor (which is explicit) does exist, and so does a lambda_functor constructor (which is implicit) from a lambda_functor_base. This is exactly what the macro BOOST_LAMBDA_PTR_ARITHMETIC_E2 immediately below does, and there is no reason for BOOST_LAMBDA_PTR_ARITHMETIC_E1 to be different.

Unfortunately, fixing that leaves another, more complicated bug: for some reason, the return type appears to be deduced as const char * instead of std::string. See for yourself.

Change History (4)

comment:1 by Steven Watanabe, 16 years ago

Logged In: YES 
user_id=1671606
Originator: NO

I have submitted a patch for this and a few other things to the mailing list.

comment:2 by nobody, 16 years ago

Logged In: NO 

Steven Watanabe's updated patch allows this test case to compile and run successfully. Thanks! Please commit it for 1.34.0.

comment:3 by Marshall Clow, 15 years ago

Component: Nonelambda
Description: modified (diff)
Owner: changed from urzuga to No-Maintainer
Severity: Problem
Status: assignednew

comment:4 by Steven Watanabe, 14 years ago

Resolution: Nonefixed
Status: newclosed

(In [50516]) Add specializations of plain_return_type_2 for std::string. Fixes #781

Note: See TracTickets for help on using tickets.