Страницы

Поиск по вопросам

вторник, 2 октября 2018 г.

&&&&& и прочие операторные странности

Недавно тут пробегал вопрос о последовательностях операторов ++++ и ----. Навеяло...
У Саттера в "Новых сложных задачах" есть забавная задачка 33 о том, сколько можно в корректном коде C++ использовать одинаковых символов того или иного оператора подряд (комментарии, препроцессор, макросы, литералы не рассматриваются).
Мой вопрос - с выходом стандарта C++11/14 изменился ли его ответ на эту задачу?
Как я понимаю, теперь последовательность >>>> становится бесконечной - в шаблонах теперь не требуется вставлять пробел...
Остальные операторы - вроде бы должны остаться неизменными.
Но теперь в C++ конструкция && приобрела еще один смысл. В связи с этим - вопрос: осталось ли неизменным решение Саттера с пятью & подряд или теперь его можно превзойти?
Это не соревнование, но если кто-то превзойдет Саттеровские решения - будет интересно посмотреть. Для справки: +-!~* - тривиальные бесконечные последовательности & - пять штук <| - по четыре ... - даже не смешно :)
Да, получить два %% или там ^^ тоже просто:
class X { public: void operator%(int); }; typedef void(X::*F)(int); void operator%(F,X){} int main(int argc, const char * argv[]) { X x; &X::operator%%x; }


Ответ

По моему мнению, использование новой семантики для && в c++11 не позволит построить более длинную цепочку, чем у Саттера (5 символов подряд). Причина, по которой я так считаю, опирается на возможные новые контексты использования &&
указание rvalue-ссылки для типа локальной переменной:
R&& r = makeR(); использование универсальной ссылки в шаблонной функции:
template void f(T&& param); использование универсальной ссылки для локальной auto переменной:
auto&& r = f(something); перегрузка функций-членов для rvalue/lvalue объектов:
struct S { void f() & {} void f() && {} };
Во всех упомянутых контекстах && используется при объявлении сущности. Указать тут больше, чем 2 & подряд, не представляется возможным. Компилятор будет сообщать, что нельзя сделать ссылку на ссылку. Например, для clang
'variable' declared as a reference to a reference
Для шаблонной функции или перегруженных для rvalue/lvalue указание типа при вызове явно не требуется, а определяется из типа выражения. Т.е. & при вызове не используются вовсе. А если и используются, то только для явного приведения, где больше двух & по-прежнему нельзя указать. Например:
static_cast(t);
При попытке указать больше - получим уже упомянутую ранее ошибку "ссылка на ссылку".
Т.о. побить рекорд Саттера для & появление новой семантики ссылок в c++11 не позволяет.

Комментариев нет:

Отправить комментарий