Soru C ++ - Return const Instagram Hesabındaki Resim ve Videoları unique_ptr


Derlerken neden bir hata aldığımı merak ediyorum:

const std::unique_ptr<int> get() { 
    return std::make_unique<int>(10);
}

int main() { 

    const std::unique_ptr<int> value = get();

    return EXIT_SUCCESS;
}

Aşağıdaki hatayı alıyorum:

main.cpp: In function ‘int main()’:
main.cpp:10:44: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete<int>]’
     const std::unique_ptr<int> value = get();

Kaldırdığımda doğru derler const itibaren get imza.

Sabit bir unique_ptr döndürmenin herhangi bir yolu var mı?


25
2017-07-24 11:44


Menşei


Gerçek mi std::unique_ptr nesnenin sabit olması mı gerekiyor yoksa veri tarafından mı işaret ediliyor? - Some programmer dude
@MooingDuck Bir dönüş türü olarak, bu garip. Aksi takdirde, pimpl, bir yapının olduğu bir durum olarak akla geliyor unique_ptr const olmayan bir nesneye bazen kullanılır.  Genel olarak const olmayanlar için const işaretçileri hakkında garip bir şey yoktur. İşaretçiyi başka bir yere getirmek ancak işaretçi nesnesini işaretçi aracılığıyla değiştirmek doğru değilse, const olmayan bir const işaretçisi bunu ifade eder ve zorlar. Bir şey yapılmadığı durumlar dışında, çoğu şey yapısını yapmak için ortak bir alıştırma uygularsa, const olmayan nesneler için const işaretçileri oldukça sık ortaya çıkar. - Eliah Kagan
@EliahKagan: A const pimpl'deki işaretçi, hareket etmelerini / değiştirilmelerini gerekenden daha yavaş yapar, ancak evet, genel olarak bir const işaretçisinin anlamlı olduğu durumlar vardır. - Mooing Duck
Bu, neden bu kadar yüksek oy aldığını bilmediğim bir x / y sorusu. İstediğini söyledin unique_ptr Buna rağmen, sabit olmak const dönüş değerleri, benzeri olmayan bir türden önce bile yeterince garip unique_ptr Bu garipliği istediğini düşündüğünüzü açıklamadan karışıma eklenir. “Neden herhangi bir açık gerekçe olmaksızın garip bir şey yapamıyorum” diye bir şey hissetmiyorum, aksi takdirde bütün günümü icat ederek ve yayınlayarak harcayabilirim. - underscore_d
@MooingDuck Orada birçok durumda gibi görünüyor const işaretçiler iyi bir fikirdir, en azından bir değer varsa const-correctness. Elbette, işlev imzası üzerinde tam kontrole sahip olmamız durumunda, bir referans kullanılmalıdır. Ancak, bir işaretçinin alındığı yere akla gelen önemsiz bir örnek gibi bir stdlib algoritmasıdır. find_if Bir kapsayıcı tutma işaretçisi içinde bir aralıkta (reference_wrapper güçlük ve görülmeye değer görünmüyor const yine de!). Kazara alma fonksiyonu içinde işaretçiyi yanlışlıkla mutasyona uğratma olasılığı varsa, bu gerçekleşir ve sonuç iyi bitmeyecektir. - underscore_d


Cevaplar:


Çünkü unique_ptr sabittir, sadece kopyalanamaz. Ve kopyalama unique_ptr izin verilmez (aksi takdirde "benzersiz" olmaz).

İşaretçi tarafından işaret edilen veri sabit olmalı, o zaman kullanın std::unique_ptr<const int> yerine.


53
2017-07-24 11:46



Sadece kısa bir not: OP'nin örneği, garantili kopya seçiminden dolayı C ++ 17'de derlemek zorundadır. - bogdan