Законные появления <=> в коде 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.