2016-05-14 32 views
10

C++ başvurusunda std::string rvalue başvurusunu kabul eden std::stringstream yapıcısını göremiyorum. Dizgeyi stringstream'e genel gider olmadan hareket ettirmek için başka bir yardımcı işlev var mıdır, yoksa bu sınırlamanın yapılmasının arkasında belirli bir neden var mıdır?std :: string dizgesine std :: string akımını iletme yolu var mı?

+5

Muhtemelen std :: stringstrream, verileri dahili olarak bir dize olarak değil, bir akış arabelleği içinde sakladığından. Bu nedenle, dizeden gelen verileri string buffer'a kopyalaması gerekiyor. Semantiği kullanmışsa, bu dizge arabelleğinin sahipliğini alması gerekir, bu nedenle nasıl dağıtıldığını (hangi kısa devre optimizasyonuna dinamik olarak tahsis edilemeyebilir) bilmeli ve geçerli bir duruma nasıl dizileceğini bilmeliyiz. Dolayısıyla, anlambilimsel hareket etmeyi sağlamak, dize ve stringstream sınıfını sıkı bir şekilde birleştirmek anlamına gelir. –

+7

@LokiAstari: "* Yani anlambilimsel hareket etmeyi sağlamak, string ve stringstream sınıfını sıkı bir şekilde birleştirmek anlamına gelir." Evet, Tanrı aynı kütüphaneden iki sınıfın birbirine bağlanmasını yasaklar ... –

+0

@NicolBolas: Kaplin genellikle birtakım tavizler olduğu anlamına gelir. Belki de standart tasarımcılar bu tradeoffları ödemek istemiyordu. std :: string çoğu C++ uygulamasında oldukça önemlidir. Üzerinde optimizasyonları sınırlamak istiyor musunuz, bu yüzden bu bir köşe kasası daha verimli mi? PS IO kütüphanesini savunmak gibi bir niyetim yok, bunu komite ile başarabilirsin (benden daha zekiler). Sadece sınırlama için makul bir açıklama yapmaya çalışıyorum. –

cevap

5

Doğruyu std::string

bir std::stringstream yapıcı kabul rvalue referansını görmüyorum. str ayarlayıcı bile hareket semantiği kullanmaz, bu nedenle stringstream'a bir dize taşıma desteklenmez (geçerli standartta değil, ancak bir sonraki bölümde de).

+1

Umarım iyi insanlar teklifler yaratır. C++ yapmak daha kolay :) –