Войти
ПрограммированиеФорумОбщее

constexpr вычитание указателей (2 стр)

Страницы: 1 2 3 Следующая »
#15
19:14, 1 янв. 2016

Проверил этот код:

#include <iostream>

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;

};

int main()
{
  const char* str = "Test string";
  StringView s(str, str + 5);

  std::cout << s.Length() << std::endl;

  return 0;
}

Никаких ошибок и предупреждений.

http://ideone.com/RZOeeH (С++14) output:

5

http://webcompiler.cloudapp.net/ (Visual C++ Compiler version: 19.00.23602.0(x86). Last updated: Dec 3, 2015) output:

5


#16
19:26, 1 янв. 2016

eMan.Lived
> Проверил этот код:
Тут и не должно быть ошибки, потому что Length() выполняется не в компайлтайме. А вот такой уже падает у меня:

int main()
{
  constexpr const char* const str = "Test string";
  enum: uintptr_t {LENGTH = StringView(str, str + 5).Length()};

  std::cout << LENGTH << std::endl;

  return 0;
}
Но почему-то на http://webcompiler.cloudapp.net/ и этот код не падает. Может этот баг отсутствовал в RTM студии, а появился в Update 1, установленном у меня?
#17
19:28, 1 янв. 2016

gammaker
> Может этот баг отсутствовал в RTM студии, а появился в Update 1, установленном
> у меня?
Конечно, почему нет.

#18
19:40, 1 янв. 2016

А вот на rextester'е компилятор падает:
http://rextester.com/FZEPLL94047

#19
19:59, 1 янв. 2016

Visual Studio 2015 Update 1 Known Issues and Fixed Bugs

Compiler improvements and breaking changes
  • The C++ compiler and standard library are updated with improved support for C++11 and C++14 features. They also include preliminary support for certain features that are expected to be in the C++17 standard. The most important changes are quality improvements for consexpr and first partial expression SFINAE support.
  • These improvements to the C++ compiler and standard library may cause breaks in existing source code. For more information, see Breaking Changes in Visual C++ 2015 Update 1.
  • :-)
    #20
    20:14, 1 янв. 2016

    Короче понятно, internal compiler error - это "quality impovement for constexpr".

    #21
    20:27, 1 янв. 2016

    gammaker
    > Но почему-то на http://webcompiler.cloudapp.net/ и этот код не падает
    Потому что на http://webcompiler.cloudapp.net/ версия компилятора больше чем в update 1. То есть этот баг уже исправлен, ждите update 2 :)

    #22
    20:27, 1 янв. 2016
    О каких улучшениях может идти речь, если они даже не могут constexpr написать правильно. ;-)

    Может быть им следует отправить багрепорт  (или что они там принимают от пользователей)?

    #23
    20:42, 1 янв. 2016

    DDragon
    > Потому что на http://webcompiler.cloudapp.net/ версия компилятора больше чем в
    > update 1. То есть этот баг уже исправлен, ждите update 2 :)
    А откуда у них новая версия? Или это сайт самого MS?

    eMan.Lived
    > Может быть им следует отправить багрепорт  (или что они там принимают от
    > пользователей)?
    В самой студии есть кнопочка, чтобы оставить отзыв или сообщить о неполадке. Я туда написал.

    #24
    22:23, 1 янв. 2016

    gammaker
    Я подозреваю, при вычитании происходит преобразование типов и у компиля от этого сносит крышу, тк это не очень законно в constexpr.

    Ты или старую версию компиля накати.

    Или учитывай, что твоя игра выйдет не скоро, поэтому для constexpr считай длину по другому. Делай как делает std::distance для не random_access_iterator. Можешь прямо из стандартной библиотеки оттуда утащить код. Ака цикл или рекурсия по всем символам со старт до енд с подсчетом их числа. Потом когда обновление майкрософт выдаст - подправишь перед релизом ну или просто игру забросишь. В любом случае не важно будет.

    #25
    12:06, 2 янв. 2016

    gammaker
    > А откуда у них новая версия? Или это сайт самого MS?

    Да, это официальный сайт команды которая компилятор делает.
    Как раз для проверки багов. На нем бывает версия новее публичной.

    #26
    19:37, 2 янв. 2016

    gammaker
    Еще есть такой вариант: ака end функцию заводишь и везде в коде ее вызываешь. Она высчитывается из длины строки и старта строки. Так ничего переделывать не придется, скобки только везде расставить. А в констэкспрес юзать будешь так, как все хранится в виде длины и старта

    #27
    19:42, 2 янв. 2016

    laMer007
    > Она высчитывается из длины строки и старта строки. Так ничего переделывать не
    > придется, скобки только везде расставить.
    Не получится. У меня полно кода, где написано --str.end и подобное.
    Ну в общем, я уже переделал по-другому.

    #28
    19:45, 2 янв. 2016

    gammaker
    > --str.end
    Тоже мне беда... Да для этого легко тоже делается. Не заводишь функцию, а заводишь функциональный объект, у которого до кучи перегружен оператор—.

    > я уже переделал по-другому
    Так рассказывай. Зря что-ли тебе отвечали. Думаешь не интересно никому чем твой бразильский сериал закончился?

    #29
    22:43, 2 янв. 2016

    laMer007
    > Тоже мне беда... Да для этого легко тоже делается. Не заводишь функцию, а
    > заводишь функциональный объект, у которого до кучи перегружен оператор—.
    Это всё костыли.

    laMer007
    > Так рассказывай. Зря что-ли тебе отвечали. Думаешь не интересно никому чем твой
    > бразильский сериал закончился?
    Ну в общем-то я решил сделать все необходимые вещи для compile time на чистых C-строках, а классы не использовать для компайлтайма. В принципе там класс почти и не использовался, так что переделывать было нечего.
    Просто начинался всё с того, что я открыл для себя constexpr и захотел всё что можно на него перевести. Но в итоге решил, что это не стоит проблем, которые при этом возникают.

    Страницы: 1 2 3 Следующая »
    ПрограммированиеФорумОбщее

    Тема в архиве.