Это все еще активная проблема, в C ++ 17 по крайней мере пока ничего не изменится. Хотя, когда такой механизм запрета определен, он может задним числом рассматриваться как DR.
из моих самых любимых / злых изобретений, с которыми мне посчастливилось столкнуться, - этосчетчик constexprака с сохранением метапрограммирования. Как упоминалось в посте, это кажется законным в C ++ 14, и мне интересно, что-нибудь изменилось с C ++ 17?
Ниже приводится реализация, в значительной степени основанная на посте.
template <int N>
struct flag
{
friend constexpr int adl_flag(flag<N>);
constexpr operator int() { return N; }
};
template <int N>
struct write
{
friend constexpr int adl_flag(flag<N>) { return N; }
static constexpr int value = N;
};
template <int N, int = adl_flag(flag<N>{})>
constexpr int read(int, flag<N>, int R = read(0, flag<N + 1>{}))
{
return R;
}
template <int N>
constexpr int read(float, flag<N>)
{
return N;
}
template <int N = 0>
constexpr int counter(int R = write<read(0, flag<0>{}) + N>::value)
{
return R;
}
И мыиспользуй это как
static_assert(counter() != counter(), "Your compiler is mad at you");
template<int = counter()>
struct S {};
static_assert(!std::is_same_v<S<>, S<>>, "This is ridiculous");
Это, кстати, прямое противоречие сХранение состояний в C ++ Метапрограммирование?