Estou explorando o recurso "deduzindo isso" e estou com dificuldades para entender como usá-lo corretamente com conceitos. Aqui está o que eu tenho:
#include <concepts>
struct X {
X() = default;
X& operator+=(int x) { value += x; return *this; }
int value = 0;
};
struct Y {
Y() = default;
template<typename Self> Self& operator+=(this Self& self, int x) {
self.value += x; return self;
}
int value = 0;
};
template<typename T, typename U>
concept has_addition_assignment =
std::is_lvalue_reference_v<T>
&& requires(T a, U b) { { a += b } -> std::same_as<T>; };
static_assert(has_addition_assignment<X&,int>); // OK
static_assert(!has_addition_assignment<const X&,int>); // OK
static_assert(has_addition_assignment<Y&,int>); // OK
// static_assert(!has_addition_assignment<const Y&,int>); // Fails
int
main()
{
// Not allowed.
// const Y y;
// y += 1;
}
O conceito é tentar garantir que X x; x += 1;
funcione, mas const X x; x += 1
não funciona. Isso funciona para, X
mas não funciona Y
, apesar de const Y y; y += 1;
falhar.
Acredito que meu conceito está escrito incorretamente ou talvez +=
não Y
expresse minha intenção corretamente. Qual é a melhor maneira de verificar se não é aceitável adicionar algo a um objeto constante ao usar deducing this?