2016-06-11 6 views
1

простого примера здесь:constexpr буквальной инициализация с constexpr

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

ошибки компиляции. Как заставить его работать, а почему нет?

+0

Массивы не могут быть инициализированы из других массивов. (Строковые литералы являются исключением.) –

+1

[Это] (http://melpon.org/wandbox/permlink/gM5T1bdeqCNItFdI) - лучшее, что я могу придумать. –

+0

Вы также можете использовать шаблон 'str_const' из слайдов Boost Con Scott Schurr, я думаю. http://stackoverflow.com/questions/27291903/passing-constexpr-objects-around –

ответ

3

обновление:

В ответ на комментарий, пересмотренный verson.

Класс immutable::string моделирует объект типа constexpr, который отслеживает исходный строковый литерал. Он очень похож на C++ 17's 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 обновленный пример для более последовательного восприятия. –

Смежные вопросы