2016-06-11 50 views
1

簡單的例子在這裏:constexpr文字初始化用constexpr

static constexpr const char literal1[] = "abcde"; 
static constexpr const char literal2[] = literal1; 

編譯錯誤。如何使它工作,爲什麼不行?

+0

數組無法從其他數組中初始化。 (字符串文字是一個例外。) –

+1

[This](http://melpon.org/wandbox/permlink/gM5T1bdeqCNItFdI)是我能想到的最好的。 –

+0

我想你也可以使用Scott Schurr的Boost幻燈片的'str_const'模板。 http://stackoverflow.com/questions/27291903/passing-constexpr-objects-around –

回答

3

更新:

迴應評論,這裏是一個修訂版本。

immutable::string建模跟蹤原始字符串文字的constexpr字符串類對象。它與C++ 17的string_view非常相似,除了模板構造函數在任何時候都不需要調用strlen

#include <cstdint> 
#include <array> 
#include <utility> 
#include <iostream> 

namespace immutable { 

    struct string 
    { 
     template<std::size_t N> 
     constexpr string(const char (&s)[N]) 
     : _data(s) 
     , _size(N-1) 
     {} 

     constexpr const char* data() const { return _data; } 
     constexpr std::size_t size() const { return _size; } 

     const char* const _data; 
     const std::size_t _size; 
    }; 
    std::ostream& operator<<(std::ostream& os, string s) 
    { 
     return os.write(s.data(), s.size()); 
    } 
} 


static constexpr auto literal1 = immutable::string("abcde"); 
static constexpr auto literal2 = literal1; 

int main() 
{ 
    std::cout << literal1 << std::endl; 
    std::cout << literal2 << std::endl; 
} 
+1

那麼,你正在改變'literal2'的實際類型。我不確定這是OP想要的。 – skypjack

+0

@skypjack我們怎麼知道他想要什麼?他沒有說。 –

+0

@skypjack更新示例給予更一致的感覺。 –