2014-11-17 22 views
8

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

+1

Evet. Bir 'string_view' sadece yüceltilmiş bir referanstır. – Rapptz

+1

[Ayrıca bkz.] (Http://stackoverflow.com/q/20803826/596781). –

cevap

13

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! 
}; 
+1

"Asla" biraz sert ama eğer saklarsanız o zaman bir "char *" – plugwash

+1

@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. –