2013-01-19 8 views
7

Trong khi thử nghiệm với C++ 11 tính năng mới, tôi phát hiện ra rằng std :: placeholders :: _ 1 có thể không được sử dụng trực tiếp như lambdas:sử dụng C++ 11 trình giữ chỗ như lambdas?

#include <algorithm> 
#include <functional> 
// #include <boost/lambda/lambda.hpp> 

using namespace std; 
// using boost::lambda::_1; 
using std::placeholders::_1; 

int main() 
{ 
    int a[] = {1,2,3,4,5}; 

    transform(a, a+5, a, _1 * 2); 
} 

Clang 3,3 lỗi:

tmp $ clang -std=c++11 -stdlib=libc++ -lc++ test.cpp 
test.cpp:16:27: error: invalid operands to binary expression ('__ph<1>' and 'int') 
    transform(a, a+5, a, _1 * 2); 

Nếu tôi thay đổi nó để sử dụng phiên bản của Boost nó biên dịch tốt.

Tại sao tính năng này không hoạt động với phiên bản chuẩn? Có cách nào để làm cho nó hoạt động hoặc tôi phải sử dụng một lambda xấu xí ở đây?

transform(a, a+5, a, [](int i){return i*2;}); 

Trả lời

7

Tăng thực sự có một số trình giữ chỗ _1. Những người từ Boost.Bind (đã được nhiều hơn hoặc ít hơn tích hợp vào C + + 11), những người từ Boost.Lambda, và thậm chí cả những người kế thừa từ Boost.Phoenix của Lambda.

Phiên bản Lambda và Phoenix là chỉ trình giữ chỗ có thể được sử dụng để tự tạo các functors. Người giữ chỗ Boost.Bind _1 không thể, và đó là những gì đã được chuẩn hóa. Lambda và Phoenix là những cách để biến một biểu thức thành một hàm; Ràng buộc chỉ đơn giản là một chức năng ràng buộc và hệ thống điều chỉnh đối số.

+0

Tôi hiểu. Sẽ là khó khăn/xấu để thực hiện tương đương với Boost: lambda/phoenix với hệ thống lambda mới? – ogoid

+0

@ogoid: Um, * cái gì * hệ thống lambda mới? Ngoài ra, bạn đang hỏi về một câu hỏi hoàn toàn khác. –

+0

@ogoid: Sẽ khá khó khăn cho tôi để phát minh lại Boost.Lambda, tôi không biết gì về bạn. – Mehrdad