2016-03-26 8 views
4

kod parçası yazılır orada [] konteyner çağıran operatör tarih:C++ std :: ileri öğenin 3'te kitabında "Etkili Modern C++", In

template<typename Container, typename Index> 
decltype(auto) 
authAndAccess(Container&& c, Index i) 
{ 
    authenticateUser(); 
    return std::forward<Container>(c)[i]; 
} 

Sana nedenini anlamıyorum std::forward numaralı telefonu arayın c, bir rvalue başvurusuysa, bir lvalue yerine bir renginde operator[]'u çağırmak için ne değişir? Benim için c[i] yeterli olmalıdır.

PS: Ben değişken olarak bir fonksiyonun bir parametre olduğu zaman std::forward amacını anlamak:

template<typename T, typename... Ts> 
std::unique_ptr<T> make_unique(Ts&&... params) 
{ 
    return std::unique_ptr<T>(new T(std::forward<Ts>(params)...)); 
} 

cevap

3

O Kap operatör [] SağDeğerler ve SolDeğerler aşırı yük altında olması mümkündür.

auto Container::opeartor[](int i) && -> Container::value_type&; 
auto Container::opeartor[](int i) & -> Container::value_type&; 

Eğer öyleyse, biz c bir rvalue ile atanmadığına, biz c üzerinde operatörün [] arasında rvalue sürümünü çağırır emin olmak istiyorum. Operatörün [], değişkenler ve rezonanslar için farklı davranması aşırı derecede yaygın değildir, ancak bu, gerçekten genel kodda, std :: 'yi operatöre iletmeden önce c'ye iletmemiz gerekir.

+0

Derleyici, c'nin r değeri ref olduğunu bildiğini, && dizininin şablon parametrelerinde ya da bir şeyleri özlediğimde geçerli olacağını biliyor muyum? – Incomputable

+0

c, değişken ayarlandıktan sonra bir değer olur. – Thomas