Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Воскресный выстрел в ногу из шаблонов / 12 сообщений из 12, страница 1 из 1
03.03.2019, 16:55
    #39781556
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Воскресный выстрел в ногу из шаблонов
Два вызова constexpr функции (вычисляемой при компиляции) дают разные результаты.
Прикол в том, что это полностью стандартное поведение без UB.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
namespace detail {
  struct A {
    constexpr A () { }
    friend constexpr int adl_flag (A);
  };

  template<class Tag>
  struct writer {
    friend constexpr int adl_flag (Tag) {
      return 0;
    }
  };
}

template<class Tag, int = adl_flag (Tag {})>
constexpr bool is_flag_usable (int) {
  return true;
}

template<class Tag>
constexpr bool is_flag_usable (...) {
  return false;
}

template<bool B, class Tag = detail::A>
struct dependent_writer : detail::writer<Tag> { };

template<
  class Tag = detail::A,
  bool    B = is_flag_usable<Tag> (0),
  int       = sizeof (dependent_writer<B>)
>
constexpr int f () {
  return B;
}

int main () {
  constexpr int a = f ();
  constexpr int b = f ();

  static_assert (a != b, "fail");
}



Тут объяснение
http://b.atch.se/posts/non-constant-constant-expressions/
Если кратко то значение функции зависит от того инстанцирован ли некий шаблон до ее вызова, а в первом месте ее вызова этот шаблон инстанцируется, поэтому следующий вызов дает другой результат.

Там есть и более короткий пример на основе noexcept, но он не работает в Clang т.к. GCC и Clang по разному трактуют стандарт.
...
Рейтинг: 0 / 0
03.03.2019, 17:37
    #39781575
a.guest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Воскресный выстрел в ногу из шаблонов
бойан
...
Рейтинг: 0 / 0
03.03.2019, 17:44
    #39781577
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Воскресный выстрел в ногу из шаблонов
a.guest, ты уже во всем этом разобрался?
...
Рейтинг: 0 / 0
03.03.2019, 17:53
    #39781578
a.guest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Воскресный выстрел в ногу из шаблонов
mayton, по памяти 100% точно не перескажу в чём фишка, а прочитал давно.
...
Рейтинг: 0 / 0
03.03.2019, 17:58
    #39781583
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Воскресный выстрел в ногу из шаблонов
Рад что для тебя здесь нет вопросов.
...
Рейтинг: 0 / 0
03.03.2019, 18:48
    #39781598
OoCc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Воскресный выстрел в ногу из шаблонов
Anatoly Moskovsky,

почему стоит "fail" при одинаковых результатах?
...
Рейтинг: 0 / 0
03.03.2019, 19:09
    #39781603
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Воскресный выстрел в ногу из шаблонов
OoCcпочему стоит "fail" при одинаковых результатах?
Потому что должны быть разные ))
...
Рейтинг: 0 / 0
03.03.2019, 19:12
    #39781604
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Воскресный выстрел в ногу из шаблонов
Потому что это два разных инстанцирования шаблонной функции.
...
Рейтинг: 0 / 0
03.03.2019, 20:49
    #39781628
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Воскресный выстрел в ногу из шаблонов
Anatoly MoskovskyПотому что это два разных инстанцирования шаблонной функции.Это не шаблонная функция а издевательство над здравым смыслом.
И вообще, шаблоны зло.
...
Рейтинг: 0 / 0
03.03.2019, 21:30
    #39781637
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Воскресный выстрел в ногу из шаблонов
Скорее злом является мета-программирование в которое нельзя зайти отладчиком.
...
Рейтинг: 0 / 0
03.03.2019, 21:43
    #39781638
a.guest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Воскресный выстрел в ногу из шаблонов
Anatoly MoskovskyПрикол в том, что это полностью стандартное поведение без UB. https://stackoverflow.com/questions/51601439/constexpr-counter-that-works-on-gcc-8-and-is-not-restricted-to-namespace-scope#comment90170666_51601439 тут пишут что подобное использование шаблонов может попадать под https://timsong-cpp.github.io/cppwp/n4659/temp.res#8.4
Если это так, то тут UB (начиная с C++17).
...
Рейтинг: 0 / 0
04.03.2019, 11:55
    #39781807
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Воскресный выстрел в ногу из шаблонов
White OwlИ вообще, шаблоны зло.
Да, мы помним. Копипаста добро ))

a.guestЕсли это так, то тут UB (начиная с C++17).
Ну это хорошо, жалко только что "no diagnostic required", хотя там вполне можно выдавать ошибку, т.к. проверка возможна при компиляции.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Воскресный выстрел в ногу из шаблонов / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]