простого примера здесь:constexpr буквальной инициализация с constexpr
static constexpr const char literal1[] = "abcde";
static constexpr const char literal2[] = literal1;
ошибки компиляции. Как заставить его работать, а почему нет?
простого примера здесь:constexpr буквальной инициализация с constexpr
static constexpr const char literal1[] = "abcde";
static constexpr const char literal2[] = literal1;
ошибки компиляции. Как заставить его работать, а почему нет?
обновление:
В ответ на комментарий, пересмотренный 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;
}
Ну, вы меняете фактический тип 'literal2'. Я не уверен, что это то, чего хочет OP. – skypjack
@skypjack, как мы можем знать, чего он хочет? Он не сказал. –
@skypjack обновленный пример для более последовательного восприятия. –
Массивы не могут быть инициализированы из других массивов. (Строковые литералы являются исключением.) –
[Это] (http://melpon.org/wandbox/permlink/gM5T1bdeqCNItFdI) - лучшее, что я могу придумать. –
Вы также можете использовать шаблон 'str_const' из слайдов Boost Con Scott Schurr, я думаю. http://stackoverflow.com/questions/27291903/passing-constexpr-objects-around –