2013-04-08 43 views
10

Sadece C++ 11'den yeni std :: işleviyle oynuyordum ve C++ ++ 3.2 ve Intel C++ derleyici 13.1 ile derleyen bir örnek yazdım ama g ++ 4.8 ile değil . Bunu bir hata olarak rapor etmeden önce, gerçekten aptalca bir şey yapmadığımı ve bunun aslında derlenmesi gerektiğini kontrol edeceğimi düşündüm. Yani, aşağıdaki kod geçerli C++ 11 mi?G ++, clang ++ ve 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; 
    } 
} 

Bu kod çok faydalı olmadığını fark ama çınlama ve Intel C++ derlenmiş ve gcc olmadıkları Tek beni vurdu.

DÜZENLEME:

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

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

çınlama ve ICPC ayrıca her ikisi de derleme: harita funktor veya işlev işaretçisi geçerken gcc de aynı kodu derlenmez.

+0

Hata nedir, g ++ size gösterir? –

+0

clang 3.0 -std = C++ 11 bu kodda çökme dökümleri – nurettin

+0

'' main() :: ',' std :: function 'türünden türetilmedi Sanırım, en azından aldığım şey bu. – filmor

cevap

10

Bu G ++ hata olduğunu, bu (standart kütüphaneden ya da bir şey) std::function kullanmaz aşağıdaki örneğe azaltılabilir:

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

Ben PR 56874 olarak Bugzilla'da o rapor ettik. Sorun lambdalarla değil, argüman indiriminin başarısız olmasına neden olan, çıkarılmamış bir bağlamdaki bir türe bağlı değildir.

+0

belki de yorumdan çıkarılan bağlam hakkındaki kısmı yorumunuza cevabınıza da ekler. – inf

+0

Tesadüfen, bunu lambdalara özgü olarak rapor ettiniz, ama aynı zamanda funktörleri veya fonksiyon göstergelerini geçerken derleme yapmayacaksınız. Bu farklı bir böcek mi yoksa aynı şey mi? – dtruby

+0

@dtruby, Yukarıdaki cevabı ve bugzilla raporunu güncelledim; –

İlgili konular