2010-08-28 9 views
19

Eğer bu işlevi varsaTam İletme C++ 03

template<typename T> f(T&); 

Sonra en

f(1); 

Neden böyle bir rvalue T sadece anlaşılamayanlar diyelim, bunu aramaya deneyin const int olmak, argümanı bir int int & yapmak ve böylece bir rivalue için ikiye dönüştürülebilir?

cevap

18

Bu, recent C++0x forwarding question bağlantılı the document potansiyel çözelti olarak söz edilir.

O olur eser

oldukça iyi, ancak mevcut kodu kırar. (Düz belgeden) düşünün:

template<class A1> void f(A1 & a1) 
{ 
    std::cout << 1 << std::endl; 
} 

void f(long const &) 
{ 
    std::cout << 2 << std::endl; 
} 

int main() 
{ 
    f(5);    // prints 2 under the current rules, 1 after the change 
    int const n(5); 
    f(n);    // 1 in both cases 
} 

Ya

// helper function in a header 

template<class T> void something(T & t) // #1 
{ 
    t.something(); 
} 

// source 

#include <vector> 

void something(bool) // #2 
{ 
} 

int main() 
{ 
    std::vector<bool> v(5); 

    // resolves to #2 under the current rules, #1 after the change 
    something(v[0]); 
} 

Bu aynı zamanda C++ 03 kadar bir sorun değil değer kategorisini (lvalue veya rvalue), iletmek başarısız . Ancak bu düzeltme yalnızca C++ 0x sırasında yapılabildiğinden, yönlendirme yaparken renaultma referanslarından kendimizi etkili bir şekilde kapatacağız (kötü bir şey). Daha iyi bir çözüm için çaba göstermeliyiz.

1

Öyle ama sen f ilan etmeleri halinde sadece T const & almaya.

template <typename T> void f(T &); 
template <typename T> void g(T const &); 

void x() { f(1); } // error: invalid initialization of non-const reference 
void y() { g(1); } // no error 

Ve ilan etmeleri halinde hemf(T &) ve f(T const &), bu seçeceğiz const nitelikli bir: öyle neden

template <typename T> void f(T &); 
template <typename T> void f(T const &); 

void x() { f(1); } // no error, calls f(T const &) 

Şimdi belki, ilk örnekte “ söylüyorsun o tip const int geçici oluşturulan ve kod derleme yapmış olabilir zaman f arama için tip int geçici üretmek? ” Benim sana olan en iyi yanıtı argümanı sabit bir tamsayı olmadığında o aşırı yük çözünürlük davranışı ile tutarsız olacağıdır.

+0

Evet, aşırı yüklenme biliyorum. Neden gerekli olduğunu bilmek istedim. Nasıl tutarsız olur? – Puppy

+0

@DeadMG: '1'' int' türüne sahiptir. Eğer bir 'int i = 1' ilan ettiyseniz, const olmayan bir yaklaşım seçecektir çünkü 'const değil. Bu nedenle, tutarlılık için, burada da geçerlidir, bir rıhtım için bu bir hatadır. –

+0

@Matthieu: 1 bir int rvalue. Ben bir int lvalue. Dil, onları farklı muamele etmekte ısrar ettiğinden, onlar farklı şeylerdir. Bu nedenle, tutarsız değil. Infact, rvalues ​​için özel bir takım kurallara sahip olmakla tutarsızlaşıyor ve sonra da onlara burada aynı davranmaya çalışıyorum. – Puppy