powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Воскресный выстрел в ногу из шаблонов
12 сообщений из 12, страница 1 из 1
Воскресный выстрел в ногу из шаблонов
    #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
Воскресный выстрел в ногу из шаблонов
    #39781575
a.guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
бойан
...
Рейтинг: 0 / 0
Воскресный выстрел в ногу из шаблонов
    #39781577
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a.guest, ты уже во всем этом разобрался?
...
Рейтинг: 0 / 0
Воскресный выстрел в ногу из шаблонов
    #39781578
a.guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton, по памяти 100% точно не перескажу в чём фишка, а прочитал давно.
...
Рейтинг: 0 / 0
Воскресный выстрел в ногу из шаблонов
    #39781583
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рад что для тебя здесь нет вопросов.
...
Рейтинг: 0 / 0
Воскресный выстрел в ногу из шаблонов
    #39781598
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

почему стоит "fail" при одинаковых результатах?
...
Рейтинг: 0 / 0
Воскресный выстрел в ногу из шаблонов
    #39781603
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OoCcпочему стоит "fail" при одинаковых результатах?
Потому что должны быть разные ))
...
Рейтинг: 0 / 0
Воскресный выстрел в ногу из шаблонов
    #39781604
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что это два разных инстанцирования шаблонной функции.
...
Рейтинг: 0 / 0
Воскресный выстрел в ногу из шаблонов
    #39781628
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyПотому что это два разных инстанцирования шаблонной функции.Это не шаблонная функция а издевательство над здравым смыслом.
И вообще, шаблоны зло.
...
Рейтинг: 0 / 0
Воскресный выстрел в ногу из шаблонов
    #39781637
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее злом является мета-программирование в которое нельзя зайти отладчиком.
...
Рейтинг: 0 / 0
Воскресный выстрел в ногу из шаблонов
    #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
Воскресный выстрел в ногу из шаблонов
    #39781807
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlИ вообще, шаблоны зло.
Да, мы помним. Копипаста добро ))

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


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