And и bitand в ситуациях, когда & и && означают ref

Рассмотрим следующий код. Для меня использование 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();
}

Найди его на Godbolt.

Было ли это упущением в спецификации C++ или это ошибка в компиляторах?

Это альтернативные токены. При синтаксическом анализе (или, возможно, даже при лексировании) они заменяются на &&, & и т. д., что означает, что они ведут себя точно так же, как и их аналоги. Вы даже можете написать struct X{ compl X() {} };, чтобы определить деструктор. Они также могут быть реализованы как макросы реализацией.

chrysante 21.07.2023 09:31

@chrysante О боже! Это ужасно, имхо.

Thomas Weller 21.07.2023 09:37

@ThomasWeller :-) Становится еще веселее, когда добавляются триграфы (думаю, они были удалены в C++ 17). ??- X() {} для деструктора...

Ted Lyngmo 21.07.2023 09:38

@ThomasWeller Думаю, это никому не повредит, и я думаю, что альтернативные токены были впервые введены, чтобы люди могли писать C на древних клавиатурах, у которых не было «специальных» символов.

chrysante 21.07.2023 09:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
4
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Было ли это упущением в спецификации C++ или это ошибка в компиляторах?

Формулировка в стандарте предполагает, что это ни то, ни другое:

Из черновика C++11

2.6 Альтернативные токены [lex.digraph]

  1. Для некоторых операторов и знаков препинания предусмотрены альтернативные представления токенов.
  2. Во всех аспектах языка каждая альтернативная лексема ведет себя соответственно так же, как и ее первичная лексема. кроме его правописания.

Примечание: во всех отношениях языка.

CppReference имеет некоторую информацию об истории, когда вы ищете альтернативные представления операторов:

[...] исходный код может быть записан в любом 7-битном наборе символов, отличном от ASCII [...] вне кодового набора ISO 646

Он относится к ISO 646:1983, где 1983 — год стандарта. Таким образом, эти альтернативы были введены для систем и старых клавиатур, в которых не было специальных символов.

Этих символов не хватало не только на клавиатурах, но и в целых системах. В наше время, конечно, меньше проблем.

Toby Speight 21.07.2023 10:03

@ThomasWeller Я абсолютно согласен с редактированием! Спасибо!

Ted Lyngmo 21.07.2023 10:04

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

С++ идемпотентность прохождения: указатель → ссылка → указатель
Есть ли какой-либо инструмент для удаления ссылки на rvalue, но не ссылки на lvalue в стандартной библиотеке?
Функция-член, которая может возвращать несколько ссылок? (С++)
Лучший способ реализовать структуру данных Trie в Rust
В чем разница между двумя способами инициализации указателя?
Почему мне нужно реализовать From как для значения, так и для ссылки? Разве методы не должны автоматически разыменовываться или заимствоваться?
Как статично преобразовать необработанный массив в структуру, состоящую только из ссылки на массив
Массив сортировки Perl создает новый элемент, если на элемент ссылаются
Макрос Excel для изменения ссылок с номерами, разделенными тире, на полный набор ссылок
Почему черта Drop выполняется только в конце области действия, а не после последнего использования?