2013-02-05 12 views
13

, bir hata alıyorum:Şablon fonksiyonu tipi kesinti ve operatör << C++ Ben <strong>MSVC++</strong> ile aşağıdaki kod derleme yaparken

struct A 
{ 
    template<typename T> 
    void operator<<(T&& x) 
    { 
    } 

}; 
void f() 
{ 
} 
int main() 
{ 
    A().operator<<(f); // ok 
    A() << f;    // error 

    return 0; 
} 

gr ++ ve clang bu kod cezası derlemek hem. AFAIK, 'Tamam' ve 'hata' satırları tam olarak aynı şeyi ve boşluğu (&)() için çıkarılır T yazın. Yoksa void() mu ve işlev için rönik referanslara izin verilir mi? Eğer öyleyse, anlamı nedir? İşlevleri bu şekilde referans olarak iletmek tamam mı? MSVC++ hata 'hata hata' derlemek için başarısız? BTW, hata çıktısı:

no operator found which takes a right-hand operand of type 'overloaded-function' (or there is no acceptable conversion) 
could be 'void A::operator <<<void(void)>(T (__cdecl &&))' 
with[ T=void (void) ] 
+1

Eğer C++ derleyicisi sürümünü sağlayabilir Visual Studio 2013 derleyici sabit olmuştur? NOV CTP güncellemesi ile – xis

+0

MSVC++ 2012, test edilen gcc 4.5.3 ve 4.7.2, clang 3.0 ve 3.1 test edilmiştir. – dsi

+0

VC11'im yok, bu yüzden araştırmam benim için zor, ama URef'in çökmesiyle bir hata gibi kokuyor. Derleyici yanlışlıkla bir RRef işlevi olarak yorumluyor ve girişte bir değer kabul etmiyor. Typedef void (* test)() olup olmadığını kontrol etmek ilginç olurdu; test g() {dönüş f; } ... A() << g(); ' –

cevap

2

Yani aşağıdaki gibi x() içeride aşırı fonksiyonu ile çağrılabilir:

Sağlanan kod geçerli olup fonksiyonlara rvalue referanslarına izin verilir iken (bunlar aynı hareket referans referansına), burada şablon indirimi sırasında T boşalmalıdır (&)(). MSVC'de bug A bug

GÜNCELLEME: böcek

4

Neden void operator<<(T&& x)? void operator<<(T& x) amacına hizmet eder.

Fonksiyon kendi soruya cevap,

struct A 
{ 
    template<typename T> 
    void operator<<(T& x) 
    { 
     x(); 
    } 

}; 
void f() 
{ 
} 

int main() 
{ 
    A().operator<<(f); 
    A() << f;    
    return 0; 
} 
+0

Hayır, rvalue başvurusu kullanıyorum, böylece geçici _function object_ taşınacak, kopyalanmayacak. _functions_ için her iki şekilde de aynı şekilde çalışacaktır. – dsi

İlgili konular