2014-11-25 16 views
70

, Ubuntu 14.04, GCC varsayılan araç zinciri.Bir constexpr dosyasında std :: string kullanmak mümkün mü? C++ 11 Kullanma

Bu kod başarısız:

constexpr std::string constString = "constString"; 

error: the type ‘const string {aka const std::basic_string}’ of constexpr variable ‘constString’ is not literal... because... ‘std::basic_string’ has a non-trivial destructor

bir constexpr içinde std::string kullanmak mümkün mü? (görünüşe göre ...) Öyleyse, nasıl? constexpr'da bir karakter dizesi kullanmanın alternatif bir yolu var mı?

+2

'std :: string' –

+3

@PiotrS bir hazır türü değil - Soru diyor ... – Vector

+0

o @ Vektör sadece edebi türler "constexpr" yapılabilir. constexpr olmak için neden std :: string'e ihtiyacınız var? belki de alternatif bir çözüm var –

cevap

81

Hayır, ve derleyici zaten size kapsamlı bir açıklama yaptı.

Ama bu yapabilirdi:

Çalışma zamanında
constexpr char constString[] = "constString"; 

, bu bir std oluşturmak için kullanılabilir :: dize gerektiğinde.

+35

Neden consttexpr otomatik constString = "constString"; '? Bu çirkin dizi sözdizimini kullanmanıza gerek yok ;-) – stefan

+16

Bu soru bağlamında daha nettir. Benim amacım hangi dize türlerini seçebileceğinizle ilgili.Kullanılacak veri türünü vurgulamaya çalıştığımda char [] ',' auto' seçeneğinden daha net/açıktır. – tenfour

+0

@stefan - Elbette onnemin açıkladığını değerlendirir, ancak bunu yapmak için çok güzel bir yoldur. :) – Vector

13

Sorun, önemsiz olmayan yıkıcı olduğundan, bu nedenle yıkıcı std::string'dan kaldırılırsa, bu tür bir constexpr örneğini tanımlamak mümkündür. C++ 17 yılında bu

struct constexpr_str { 
    char const* str; 
    std::size_t size; 

    // can only construct from a char[] literal 
    template <std::size_t N> 
    constexpr constexpr_str(char const (&s)[N]) 
     : str(s) 
     , size(N - 1) // not count the trailing nul 
    {} 
}; 

int main() 
{ 
    constexpr constexpr_str s("constString"); 

    // its .size is a constexpr 
    std::array<int, s.size> a; 
    return 0; 
} 
+2

Ancak standart kütüphane kodunuz özel sınıfınız hakkında bilgi sahibi değil ... – einpoklum

+7

Temelde C++ 17 'string_view' nedir, 'string_view'' std :: string' den bildiğiniz işlevselliklerin çoğunu size sunar – wich

46

gibi, string_view kullanabilirsiniz:

constexpr std::string_view sv = "hello, world"; 
İlgili konular