Sadece biraz yanlış anlama koştu rvalue ifadesini bu kurucuya iletirsek, yapım sonrası __data kullanırken tanımsız bir davranış olur mu?string_view davranış :: dize
cevap
Doğru. Bir string_view
, yalnızca başvurulan dize görünümün kullanımını geçtiğinde kullanılması gereken referans semantiklerine sahip bir sahip olmayan sargıdır. Gerçek dize işlev çağrısı süresi ve görünümünü saklar asla fonksiyon vücut için yaşadığı
tipik bir kullanım durumu
fonksiyon parametrelerinde, ama sadece okur o:void foo(std::experimental::string_view message) // pass by value
{
std::cout << "You said, '" << message << "'.\n";
}
Kullanımı:
foo("Hello"); // OK, string literal has static storage
foo(s); // OK, s is alive
foo(s.substr(1)); // OK, temporary lives until end of full-expression
ahlaki şudur: yalnızca işlev gövdesinin süresince dize gerekiyorsa, işlevini bir string_view
parametreyi vermek ve tekdüze stringoid argume her türlü bağlanabildiği nt. Bir işlev şablonuna ihtiyacınız yoktur, string_view
s kopyalamak ucuzdur ve ücretsiz olarak düzgün bir alt bölümleme işlemi gerçekleştirirsiniz. Buna karşılık, bir string_view
depolamak, ama her zaman saklamak asla string
:
struct X
{
X(std::experimental::string_view s) : s_(s) {}
std::string s_; // NEVER have a string_view class member!
};
"Asla" biraz sert ama eğer saklarsanız o zaman bir "char *" – plugwash
@plugwash: Belki de saklarsan dikkat etmelisin. Ama manzarayı saklarsan kesinlikle mesaj dışı kalacağını söyleyebilirim. Evet, sadece bir prvalue olarak kullanılan geçici bir sınıfta * bunu kullanabileceksiniz, ancak bu kod muhtemelen görüntülenen dizginin callable'ı geride bıraktığını açıkça gösteren lambdalarla yazılmış daha iyidir. –
Evet. Bir 'string_view' sadece yüceltilmiş bir referanstır. – Rapptz
[Ayrıca bkz.] (Http://stackoverflow.com/q/20803826/596781). –