Visual C ++ известен тем, что игнорирует квалификаторы функции constexpr, если только это не является абсолютно необходимым. Посмотрите на следующую функцию:
constexpr int multiply(int l, int r) noexcept
{
return l * r;
}
Согласно стандарту, Visual C ++ полностью разрешено не оценивать rvalue во время компиляции:
auto three_times_four = multiply(3, 4);
Обходной путь, который я использовал using - это уродливая сила:
constexpr auto constexpr_three_times_four = ;
auto not_constexpr_three_times_four = constexpr_three_times_four;
// use not_constexpr_three_times_four in non-constexpr contexts
// alternatively:
template<auto val>
inline constexpr auto ensure_constexpr = val;
auto not_constexpr_three_times_four = ensure_constexpr<multiply(3, 4)>;
Есть ли способ намекнуть компилятору, что эти вещи должны оцениваться во время компиляции?
Меня особенно раздражает следующее :
namespace l
{
constexpr ::std::uint32_t operator""_crc32(const char * p, ::std::size_t const size) noexcept
{
return crc32(p);
}
}
//...
using namespace l;
search("foo"_crc32);//You don't want to evaluate this at runtime? too bad.
Итак, что я могу сделать, чтобы намекнуть компилятору в этом случае и избежать этих уродливых исправлений?