Hatalar, hatalar, sorular - sayfa 2419

 
Alexey Navoykov :

Dile bir r-değeri olarak bir argüman iletme yeteneği ekleme konusundaki düşünceleriniz nelerdir? Bu, tüm sorunları hemen çözecek ve her tür için evrensel kapsayıcılar oluşturmanıza olanak sağlayacaktır.

gibi? ) evrensel kaplar için bağlantılar ve oklar gereklidir ve hepsi bu kadar değil.

ve buradaki ortalama kullanıcı r-değeri yapacak kişi değil.

 
Alexey Navoykov :

Dile bir r-değeri olarak bir argüman iletme yeteneği ekleme konusundaki düşünceleriniz nelerdir? Bu, tüm sorunları hemen çözecek ve her tür için evrensel kapsayıcılar oluşturmanıza olanak sağlayacaktır. Özellikle, yukarıdaki yöntem r değeri için aşırı yüklenecektir:

Bu tam olarak tüm STL kapsayıcılarında uygulanan şeydir.

Ve ikinci artı: move yapıcılarını ayarlamanıza izin verecektir. Şimdi bu, özellikle unique_ptr akıllı işaretçilerin ve belirli bir benzersiz kaynağı yalnızca kendi içlerinde depolamak üzere tasarlanmış diğer sınıfların uygulanması için de çok eksiktir, yani. normal kopya kurucuları onlar için kabul edilemez.

O zaman bir parametreyi referans olarak geçirmenin amacı nedir?

 
Slava :

O zaman bir parametreyi referans olarak geçirmenin amacı nedir?

çok garip sorular soruyorsun r-değeri referansları tamamen hareket semantiği içindir. diğer her şey için düzenli bağlantılar.
 
Slava :

O zaman bir parametreyi referans olarak geçirmenin amacı nedir?

Hangi linkten bahsettiğinizi tam anlayamadım. Başlangıçta, l-değeri referanslarının (MQL'de mevcuttur) tüm ihtiyaçları karşılamadığı konuşuluyordu, bu da böyle bir fonksiyona bir sabit veya ifade değeri geçirmenin imkansızlığı ile kanıtlandı. Bu amaçlar için, diğer tüm türleri kabul edecek bir r-değeri referansına ihtiyaç vardır. Böylece, r-değeri ve l-değeri için iki aşırı yüklenmiş fonksiyonun kombinasyonu, kökenlerine bakılmaksızın her tür argümanın kabul edilmesini sağlayacaktır.

Sabitin herhangi bir yerde depolanmadığını, ancak anında oluşturulduğunu söylemeniz, bunun bir l değeri değil (C++ 'dan farklı olarak) bir r değeri olarak iletilmesi gerektiği anlamına gelir. Hangi biçimde yorumlandığı konusunda temel bir fark yoktur, asıl şey bir işlevde kabul edilebilmesidir.

 
Alexey Navoykov :

Sabitin herhangi bir yerde depolanmadığını, ancak anında oluşturulduğunu söylemeniz, bunun bir l değeri değil (C ++ 'dan farklı olarak) bir r değeri olarak iletilmesi gerektiği anlamına gelir. Hangi biçimde yorumlandığı konusunda temel bir fark yoktur, asıl şey bir işlevde kabul edilebilmesidir.

Aslında, bir r-değeri referansı, hareketin yapılacağı bir nesnenin varlığını ima eder. onlar. geçici nesne aynı şekilde oluşturulmalıdır.

 
TheXpert :

Aslında, bir r-değeri referansı, hareketin yapılacağı bir nesnenin varlığını ima eder. onlar. geçici nesne aynı şekilde oluşturulmalıdır.

Eh, elbette, nesne her zaman orada bir yerdedir. Bu nesnenin anında yaratıldığını yazdım, yani. geçici.

Ama Slava'nın ne istediğini anlıyor gibiyim. Değerine göre alabilecekken neden geçici bir nesneyi referans olarak alın demek istedi.

Yani mesele şu ki, bir referans için ve bir kapsamdaki bir değer için bir fonksiyonu aynı anda aşırı yüklemek imkansız:

 template < typename T>
 void f(T) { }
template < typename T>
 void f(T const &) { }
 
class A { };

void OnStart ()
{
  A a;
  f(a);
   const int b= 0 ;
  f(b);   // 'f' - ambiguous call to overloaded function with the same parameters
}

bu da evrensel çözümler yazmayı sorunlu hale getiriyor. Ve değeri r-değeri ile değiştirerek, çalışan bir sürüm elde ederiz:

 template < typename T>
 void f(T && ) { }
template < typename T>
 void f(T const &) { }
 
Alexey Navoykov :

Değerine göre alabilecekken neden geçici bir nesneyi referans olarak alın demek istedi.

çünkü

 void f( int ) {}
void f( const int &) {}

void OnStart ()
{
   const int x = 0 ;
   f(x); // 'f' - ambiguous call to overloaded function with the same parameters
}

ve bir şeyi değerden ziyade referansa göre iletmek genellikle daha uygun olduğu için.

ve eğer yöntem şablon ise (içkinin aslında ondan çıktığı), o zaman mevcut davranış normal yazmaya izin vermiyor.

 
TheXpert :

ve eğer yöntem şablon ise (içkinin aslında ondan çıktığı), o zaman mevcut davranış normal yazmaya izin vermiyor.

Evet, örneğimi bir şablonla ints ile değiştirdim, böylece daha görsel oldu, aksi takdirde referansla geçen int'ler gerçekten çok inandırıcı görünmüyor)
 
Alexey Navoykov :

bu da evrensel çözümler yazmayı sorunlu hale getiriyor. Ve değeri r-değeri ile değiştirerek, çalışan bir sürüm elde ederiz:

tam olarak değil )

Hareket semantiği, taşınan nesneye iç kısımları çıkarmamasını söylemeyi içerir. nesne const ise, değiştirilebilir bir sınıf üyesi gereklidir, mql bunu desteklemez

 
TheXpert :

tam olarak değil )

Hareket semantiği, taşınan nesneye iç kısımları çıkarmamasını söylemeyi içerir. nesne const ise, değiştirilebilir bir sınıf üyesi gereklidir, mql bunu desteklemez

Evet, haklısın, const for r-value'nun ayarlanmasına gerek yoktu (böyle iyi derlenmiyor). şimdi düzelteceğim)