2013-04-08 30 views
10

Właśnie bawiłem się z nową funkcją std :: z C++ 11, i napisałem przykład, który kompiluje się z clang ++ 3.2 i kompilatorem Intel C++ 13.1, ale nie z g ++ 4.8 . Zanim zgłosiłem to jako błąd, pomyślałem, że sprawdzę, czy nie robię czegoś naprawdę głupiego i że to powinno się właściwie skompilować. Zatem, czy poniższy kod jest prawidłowy C++ 11?G ++, clang ++ i 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; 
    } 
} 

Zdaję sobie sprawę, że ten kod nie jest bardzo przydatne, ale uderzyło mnie jak dziwne, że dzyń i Intel C++ skompilowany i gcc nie.

EDIT: gcc nie będzie również skompilować ten sam kod przechodząc zmapować funktora lub funkcyjny wskaźnik:

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

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

dzyń i ICPC również przygotować zarówno z nich.

+0

Jaki błąd wyświetla się w g ++? –

+0

clang 3.0 z opcją -std = C++ 11 zrzutu awaryjnego na tym kodzie – nurettin

+0

''main() :: ' nie pochodzi od 'std :: function ' "Myślę, że to przynajmniej to, co otrzymuję. – filmor

Odpowiedz

10

To jest G ++ bug, może być zmniejszona do następującego przykładu, który nie korzysta std::function (lub czegokolwiek z biblioteki standardowej):

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); 
} 

Ja zgłosiłem to do Bugzilli jako PR 56874. Problem nie jest związany z lambdami, ale z typem w niezorientowanym kontekście, który niepoprawnie powoduje odrzucenie argumentu.

+0

może dodać część z kontekstu nie wydedukowanego z twojego komentarza do twojej odpowiedzi. – inf

+0

Nawiasem mówiąc, zgłosiłeś to jako specyficzne dla lambd, ale nie skompiluje się, gdy przekazuje funktory lub wskaźniki funkcji. Czy to inny błąd lub część tego samego? – dtruby

+0

@dtruby, zaktualizowałem powyższą odpowiedź i raport bugzilla: nie skompiluje się podczas przekazywania 'int' albo –

Powiązane problemy