Можно ли заменить следующие ref-квалификаторы понятиями?
То есть вместо
struct S
{
void func() && {}
void func() & {}
};
есть что-то вроде этого
struct S
{
void func() requires rvalue_concept< decltype(*this) > {}
void func() requires lvalue_concept< decltype(*this) > {}
};
Есть ли какая-то причина, по которой вы хотите избежать использования синтаксиса?
@NicolBolas: я хочу применить это к деструктору. Думаю, мне нужно сформулировать новый вопрос по SO.
Можно ли заменить ref-квалификаторы понятиями?
Вы можете использовать синтаксис явного параметра объекта , представленный в c++23, который позволяет нам определить тип this
.
При этом вы могли бы написать:
template<typename T>
concept rvalue_concept = std::is_rvalue_reference_v<T&&>;
template<typename T>
concept lvalue_concept = !rvalue_concept<T>;
struct S
{
template<typename Self>
void func(this Self&& self) requires rvalue_concept<Self>
{
std::cout << "rvalue version called\n";
}
template<typename Self>
void func(this Self&& self) requires lvalue_concept<Self>
{
std::cout << "lvalue version called\n";
}
};
Есть ли какая-то причина, по которой вы не могли просто написать void func(this S&& self);
и void func(this S& self);
? Какой смысл там в шаблоне?
Возможно, это Явные функции-члены объекта — еще один способ сделать это.