Рассмотрим следующий код.
Для меня использование and
и bitand
явно нарушает семантику.
#include <iostream>
class C
{
public:
void f() and // meaning &&
{
std::cout << " f() and\n";
}
void f() bitand // meaning &
{
std::cout << " f() bitand\n";
}
};
int main()
{
C{}.f();
C c;
c.f();
}
Было ли это упущением в спецификации C++ или это ошибка в компиляторах?
@chrysante О боже! Это ужасно, имхо.
@ThomasWeller :-) Становится еще веселее, когда добавляются триграфы (думаю, они были удалены в C++ 17). ??- X() {}
для деструктора...
@ThomasWeller Думаю, это никому не повредит, и я думаю, что альтернативные токены были впервые введены, чтобы люди могли писать C на древних клавиатурах, у которых не было «специальных» символов.
Было ли это упущением в спецификации C++ или это ошибка в компиляторах?
Формулировка в стандарте предполагает, что это ни то, ни другое:
Из черновика C++11
2.6 Альтернативные токены [lex.digraph]
- Для некоторых операторов и знаков препинания предусмотрены альтернативные представления токенов.
- Во всех аспектах языка каждая альтернативная лексема ведет себя соответственно так же, как и ее первичная лексема. кроме его правописания.
Примечание: во всех отношениях языка.
CppReference имеет некоторую информацию об истории, когда вы ищете альтернативные представления операторов:
[...] исходный код может быть записан в любом 7-битном наборе символов, отличном от ASCII [...] вне кодового набора ISO 646
Он относится к ISO 646:1983, где 1983 — год стандарта. Таким образом, эти альтернативы были введены для систем и старых клавиатур, в которых не было специальных символов.
Этих символов не хватало не только на клавиатурах, но и в целых системах. В наше время, конечно, меньше проблем.
@ThomasWeller Я абсолютно согласен с редактированием! Спасибо!
Это альтернативные токены. При синтаксическом анализе (или, возможно, даже при лексировании) они заменяются на
&&
,&
и т. д., что означает, что они ведут себя точно так же, как и их аналоги. Вы даже можете написатьstruct X{ compl X() {} };
, чтобы определить деструктор. Они также могут быть реализованы как макросы реализацией.