Size: a a a

2020 August 17

A

Alex in pro.cxx
Похоже, что нет. Мне даже в голову не пришло, что он не станет constexpr. Причём MSVC и GCC оба это компилят. Спасибо за наводку.
источник

CD

Constantine Drozdov in pro.cxx
Alex
Похоже, что нет. Мне даже в голову не пришло, что он не станет constexpr. Причём MSVC и GCC оба это компилят. Спасибо за наводку.
Так а в чем проблема-то
источник

CD

Constantine Drozdov in pro.cxx
берешь выражение
static constexpr auto idOf = TypeRegistry::allowed_types::template index_of<char>;
оно сломано
источник

CD

Constantine Drozdov in pro.cxx
раскрываешь дальше
источник

A

Alex in pro.cxx
Понял принцип, спасибо
источник

A

Alex in pro.cxx
Я честно думал, что при соотношении 2:1 должен быть неправ clang, поэтому не очень пытался
источник

CD

Constantine Drozdov in pro.cxx
Alex
Я честно думал, что при соотношении 2:1 должен быть неправ clang, поэтому не очень пытался
constexpr auto f()
{
   std::optional<size_t> index;
   static_for<0, 7>([&index](auto i) {
       if (!index) // The index of the first occurrence is stored
       {
           if constexpr (std::is_same_v < char, pack::type_by_index < static_cast<size_t>(decltype(i){}), char, int, float, double, int64_t, uint64_t, void >> )
               index = static_cast<size_t>(decltype(i){});
       }
       });

   return index;
}

вот это работает
источник

CD

Constantine Drozdov in pro.cxx
так что дело не в optional
источник

CD

Constantine Drozdov in pro.cxx
    static constexpr auto idOf = *f();
   static_assert(idOf == 0);
источник

A

Alex in pro.cxx
Но он не помечен constexpr на cppref
источник

CD

Constantine Drozdov in pro.cxx
Alex
Но он не помечен constexpr на cppref
constexpr auto f() noexcept
{
   constexpr auto index = pack::index_for_type<char, char, int, float, double, int64_t, uint64_t, void>();
   static_assert (index, "Type not found in pack");
   return *index;
}
static constexpr auto idOf = f();
static_assert(!idOf);

вот такая бодяга у тебя
источник

A

Alex in pro.cxx
Большое спасибо, сейчас разберусь. Хм.
источник

A

Alex in pro.cxx
Constantine Drozdov
constexpr auto f() noexcept
{
   constexpr auto index = pack::index_for_type<char, char, int, float, double, int64_t, uint64_t, void>();
   static_assert (index, "Type not found in pack");
   return *index;
}
static constexpr auto idOf = f();
static_assert(!idOf);

вот такая бодяга у тебя
но это же компилится clangом
источник

CD

Constantine Drozdov in pro.cxx
Alex
но это же компилится clangом
мож я вызываю криво?
источник

A

Alex in pro.cxx
не понимаю, кстати, почему компилится, ведь id должен получиться 0, !0 == false, assert должен сработать
источник

A

Alex in pro.cxx
Constantine Drozdov
мож я вызываю криво?
в моём коде точно есть такое, вопрос только в том, что вызывает ошибку именно в clang, я пока так и не понял
источник

CD

Constantine Drozdov in pro.cxx
а сорри я глупенький
источник

CD

Constantine Drozdov in pro.cxx
Alex
Большое спасибо, сейчас разберусь. Хм.
отбой, я там *index написал
источник

A

Alex in pro.cxx
понял, вижу ошибку, спасибо большое. У меня, видимо, башка уже не варит в такое время, тоже не заметил (точнее, не осознал)
источник

A

Alex in pro.cxx
Но я не пойму, у меня где-то есть такой ассёрт с отрицанием? Т. е. проверка на пустоту optional? Вроде ж, нет.
источник