Я хочу, чтобы экземпляр класса преобразовывался в int
при использовании оператора присваивания. Поэтому я написал этот код:Как удалить функцию из разрешения перегрузки?
struct X
{
X() = default;
X& operator=(int) { std::cout << "operator=(int)\n"; return *this; }
operator int() { return 0; }
};
int main()
{
X a, b;
a = b;
}
Но он не называется. Это связано с тем, что он вызывает неявный оператор присваивания копий, который является точным соответствием для аргумента. Я хочу, чтобы мой код сначала вызывал оператор преобразования на b
, а затем привязывал возвращаемое значение int
к operator=()
.
Есть ли синтаксис, чтобы сообщить компилятору «не считать эту функцию»? Другими словами, как удалить функцию из разрешения перегрузки?
Я пробовал использовать шаблоны на операторе копирования-присваивания, чтобы я мог делать SFINAE, но, я думаю, это просто создает другую функцию, поэтому не-шаблон всегда будет лучшим совпадением.
Nope. Вы можете сделать ошибку, чтобы вызвать что-то (путем удаления его), но вы ничего не можете удалить. –
Вы можете просто указать его явно: a = static_cast (b); 'Это также было бы более интуитивно понятным поведением для кого-то другого, просматривающего ваш код. –
Praetorian