SORU
19 Kasım 2011, CUMARTESİ


initializer_list ve hareket semantiği

std::initializer_list<T> dışarı öğeleri taşımak için iznim var mı?

#include <initializer_list>
#include <utility>

template<typename T>
void foo(std::initializer_list<T> list)
{
    for (auto it = list.begin(); it != list.end();   it)
    {
        bar(std::move(*it));   // kosher?
    }
}

std::intializer_list<T> özel derleyici dikkat gerektirir ve standart C kitaplığı normal kapları gibi değer semantik olmadığı için, çok üzgünüm daha güvenli olacağını ve sor.

CEVAP
19 Kasım 2011, CUMARTESİ


Hayır, tasarlandığı gibi çalışmaz; hala kopya alırsınız. initializer_list onlar kadar geçici bir dizi tutmak için var olduğunu düşünmüştüm bu beni şaşırttı güzel, move'd.

begin initializer_list iade const T *, yani kodunuzda move sonucu end T const && — değişmez rvalue başvurusu. Böyle bir ifadeyi anlamlı bir hareket olamaz. Bu tür fonksiyon bir parametre T const & rvalues çünkü bağlama bağlama lvalue başvuruları inş yapacak, ve hala semantiği kopyasını göreceksiniz.

Muhtemelen bu nedenle, bu yüzden derleyici olabilir seçme yapmak initializer_list statik olarak başlatıldı sabit, ama göründüğü olurdu temizleyici için yapmak türü initializer_list const initializer_list derleyici takdirine, çok kullanıcı bilmiyor olsun bekliyoruz const ya da değişken sonucu begin end. Ama bu sadece benim hislerime, ben yanılıyorum iyi bir sebebi vardır muhtemelen.

Güncelleme:Hareket-tek tip initializer_list destek için an ISO proposal yazdım. Sadece bir ilk taslak olduğunu ve henüz hiçbir yerde uygulanan bir şey değil, ama sorunun daha fazla analiz için görebilirsiniz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Amir Parmar

    Amir Parmar

    25 Kasım 2010
  • Kat Krazy

    Kat Krazy

    12 Kasım 2010
  • ThePhestor

    ThePhestor

    22 Mart 2011