Есть класс строки с указателями на начало и на конец и функция Length, которая возвращает разность этих указателей. При вызове этой функции во время компиляции компилятор 2015 студии (Update 1) падает.
Этот код
constexpr const char* const str="egvwgvberb"; constexpr const char* const str2=str+3; constexpr const uintptr_t str3=str2-str;
Hardcode
> Выбрать другой компилятор или язык, например
Ну это вообще не вариант.
Hardcode
> Пытаться воротить сложные шаблоны в студии - ССЗБ
И где ты видишь сложные шаблоны в этих трёх строчках кода?
gammaker
Мне надо было сказать сложный compiletime
Как видишь, он оказался достаточно сложный для студии
Компайл тайм строчки и прочее говно...
Лучшее забей, не предназначены кресты для такого, чего уж там.
gammaker
Преобразование типов сделай, чтобы не было указателей или юзай строковые литералы в их первозданной форме (массив чаров). Короче ищи тот путь, которым результат будет тот же, что и планировался, а падать не будет
laMer007
> Преобразование типов сделай, чтобы не было указателей
Как именно? Преобразование указателя в целочисленный тип constexpr не разрешает. Ну ладно, попробую как-нибудь временно перекантоваться, а когда выйдет новый компилятор и они починят это, сделаю так, как хотел.
gammaker
А так:
constexpr const uintptr_t str3=(uintptr_t)(str2-str);
Mikle
Пробовал, ошибка происходит до каста.
gammaker
> Как именно?
Тебе бы может кто-нибудь уже помог, еслиб ты минимальный код, демонстрирующий проблему со всеми инклудниками выложил.
laMer007
> Тебе бы может кто-нибудь уже помог, еслиб ты минимальный код, демонстрирующий
> проблему со всеми инклудниками выложил.
Я хочу сделать compile time строки, при этом в них должны храниться именно указатели на начало и конец, а не начало и длина. Почему? Потому что у меня есть уже готовый класс строки, в котором сделано именно так и я не хочу дублировать и переделывать кучу кода. Хочу объединить всё это в общий код.
class StringView { public: constexpr StringView(const char* start_, const char* end_): start( start_), end( end_) {} constexpr uintptr_t Length( ) const {return end-start;} //internal compiler error //... Сравнение, взятие подстроки, поиск и т.п. ... private: const char* start; const char* end; }; class string: public StringView { public: //... Конкатенация, замена, управление своей памятью и т.п. ... };
gammaker
> Потому что у меня есть уже готовый класс строки
Ты вообще уверен, что твои строки в компайлтайме взлетят? Я констэкспрес не пользуюсь, но _мне говорили_, что даже std::string не взлетает почти в компайлтайме при конкатинации.
Ну вот что ты выложил? Помнишь, что говорил Kartonagnick? Выкладывай с инклудниками, майном, примером что это не работает на онлайнкомпиляторе давай, а не просто чтобы мы все за тебя сделали. Никто уважающий себя даже пытаться не будет делать за тебя твою работу. Где уважение к собеседникам? Учись задавать вопросы, как это делает Suslik
laMer007
> Я констэкспрес не пользуюсь, но _мне говорили_, что даже std::string не
> взлетает почти в компайлтайме при конкатинации.
Мне не нужна конкатенация в compile time.
laMer007
> Ты вообще уверен, что твои строки в компайлтайме взлетят?
В компайлтайме мне нужен минимум функционала StringView: конструктор от литерала, operator[] и Length(). Я могу всё это обеспечить, чтобы это работало, если хранить длину. А если хранить указатель на конец, то получается такая ошибка компиляции. Как вариант, делать отдельные классы для compile time и для runtime, либо переделать огромный класс строки с указателями start и end на хранение и работу с length. Но я хочу объединить в один, не переделывая это.
laMer007
> Выкладывай с инклудниками, майном, примером что это не работает на
> онлайнкомпиляторе давай
А есть онлайн компилятор из студии? На GCC\Clang наверняка всё сразу работать будет.
>а не просто чтобы мы все за тебя сделали.
>Никто уважающий себя даже пытаться не будет делать за тебя твою работу.
Какую работу? Мне нужно обойти баг компилятора MS, который полностью выражен в тех трёх строчках. Всё остальное к этому значения почти не имеет. Мой вопрос лишь про то, как записать строчку 3 из нулевого поста, чтобы не было ошибки компиляции, либо убедить меня в том, что это сделать невозможно и нужно с этим смириться. А всё остальное, что я тут написал, это вы уже подробности выпытали, который имеют к этому лишь косвенное отношение.
gammaker
>А есть онлайн компилятор из студии?
Как минимум:
http://rextester.com/l/cpp_online_compiler_visual
//Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23026 for x86
Тема в архиве.