2013-04-08 47 views
10

Tôi chỉ đang chơi với hàm std :: mới từ C++ 11, và tôi đã viết một ví dụ biên dịch với clang ++ 3.2 và trình biên dịch C++ của Intel 13.1 nhưng không phải với g ++ 4.8 . Trước khi tôi báo cáo lỗi này, tôi nghĩ rằng tôi sẽ kiểm tra xem tôi không làm điều gì đó thực sự ngu ngốc và điều này thực sự phải biên dịch. Vì vậy, mã sau đây có hợp lệ C++ 11 không?G ++, clang ++ và std :: function

template <typename C> 
void map(C& c, std::function<typename C::value_type(typename C::value_type)> f) 
{ 
    for(auto& x : c) { 
     x = f(x); 
    } 
} 

int main() 
{ 
    std::vector<int> v; 
    v.push_back(1); 
    v.push_back(2); 
    v.push_back(3); 
    map(v, [](int x) { return x+2; }); 

    for(auto x : v) { 
     std::cout << x << std::endl; 
    } 
} 

Tôi nhận thấy rằng mã này không hữu ích nhưng nó đánh tôi như kỳ quặc mà clang và Intel C++ biên dịch nó và gcc không.

EDIT: gcc cũng sẽ không biên dịch mã tương tự khi đi qua bản đồ một functor hoặc chức năng con trỏ:

struct { 
    int operator() (int a) { 
     return a+2; 
    } 
} add2s; 
map(v, add2s); 

int add2 (int a) { 
    return a+2; 
} 
map(v,add2); 

kêu vang và ICPC cũng biên dịch cả hai.

+0

Lỗi là gì, g ++ cho bạn thấy? –

+0

clang 3.0 với -std = C++ 11 bãi đổ vỡ trên mã này – nurettin

+0

''chính() :: ' không được bắt nguồn từ hàm 'std :: ' Tôi đoán, đó là ít nhất những gì tôi nhận được. – filmor

Trả lời

10

Đây là một ++ lỗi G, nó có thể được giảm xuống ví dụ sau đây mà không sử dụng std::function (hoặc bất cứ điều gì từ thư viện tiêu chuẩn):

template<typename T> 
struct function 
{ 
    function(int) 
    { } 
}; 

struct V { 
    typedef int value_type; 
}; 

template <typename C> 
void map(C&, function<typename C::value_type>) 
{ 
} 

int main() 
{ 
    V v; 
    map(v, 1); 
} 

Tôi đã báo cáo nó để bugzilla như PR 56874. Vấn đề không liên quan đến lambdas, nhưng đối với một loại trong một bối cảnh không suy luận không chính xác gây ra suy luận đối số thất bại.

+0

có thể thêm phần về ngữ cảnh không suy luận từ nhận xét của bạn cho câu trả lời của bạn. – inf

+0

Ngẫu nhiên, bạn đã báo cáo điều này là cụ thể đối với lambdas, nhưng nó sẽ không biên dịch khi truyền functors hoặc con trỏ hàm. Đó có phải là một lỗi hoặc một phần khác của cùng một lỗi không? – dtruby

+0

@dtruby, tôi đã cập nhật câu trả lời ở trên và báo cáo lỗi: nó sẽ không biên dịch khi chuyển một 'int' hoặc –

Các vấn đề liên quan