Законные появления <=> в коде pre-C++20

Возиться в wandbox Я обнаружил, что Clang действительно выдаст предупреждение, если увидит <=> появляются в C++17 или ранее.

warning: '<=>' is a single token in C++2a; add a space to avoid a change in behavior [-Wc++2a-compat]

Я пытался выяснить, как написать законный вариант использования последовательности символов <=> в C++17, но все, что я придумаю, чувствуется очень надуманным. Наиболее вероятный пример (imo) включает использование шаблона:

struct A {
  bool operator<=(A) const { return true; }
};

template <auto Cmp>
void f() { }

int main() {
  f<&A::operator<=>();
}

живой пример

Все остальное по-прежнему связано с явным упоминанием функции сравнения по имени. operator<=, Есть ли более распространенный вид <=> что я не представляю, что побудило разработчиков Clang добавить это предупреждение?

1 ответ

Решение

Есть некоторые другие возможные синтаксисы, которые не обязательно включают в себя такой аргумент шаблона. Например,

class A {};
bool operator<=(A,A) { return true; }

class B {};
bool operator>(bool(*)(A,A), B) { return false; }

int main()
{
    B b;
    return operator <=> b;
}

Но это правда, что все такие примеры имеют ключевое слово operator непосредственно перед появлением <=>,

Единственный способ доказать такое утверждение - выполнить исчерпывающий поиск по всей грамматике C++, удобно показанной в одном месте в Приложении A к стандарту C++17 и в некоторых других версиях Standard.

Во-первых, обратите внимание, что из-за правила Maximal Munch, если следующие исходные символы после разбора предыдущих токенов препроцессора <=>, то C++17 и более ранние версии всегда будут обрабатывать первый токен как <=, Следующим токеном может быть > или же >> или же >= или же >>=,

Единственные правила грамматики, связанные с токеном <= являются:

фолд-оператор:

<=

реляционное выражение:

Реляционная выражение <= Сдвиг-выражение

оператор:

<=

Оператор свертывания грамматического символа используется только в:

складное выражение:

( оператор сгиба выражения приведения ... )

( ... выражение-выражение оператора сгиба )

( оператор сгиба выражения приведения ... выражение-выражение оператора сгиба )

Так как фолд-оператор, <= должно сопровождаться либо ... токен (который, конечно, не > или же >> или же >= или же >>=) или приведенное выражение. В качестве оператора сгиба или в реляционном выражении <= за токеном может следовать выражение приведения или выражение- смещение, которые оба являются ограниченным видом выражения. Но нет грамматического правила, позволяющего начинать любое выражение > или же >> или же >= или же >>=,

Остается только оператор символа грамматики, найденный только в:

идентификатор-функции-оператора:

operator оператор

который показывает, что ключевое слово operator должно быть непосредственно перед <= который может вместо этого стать частью <=> в С ++20.

Другие вопросы по тегам