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.
Evet, aşırı yüklenme biliyorum. Neden gerekli olduğunu bilmek istedim. Nasıl tutarsız olur? – Puppy
@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. –
@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