Недавно тут пробегал вопрос о последовательностях операторов ++++ и ----. Навеяло... У Саттера в "Новых сложных задачах" есть забавная задачка 33 о том, сколько можно в корректном коде C++ использовать одинаковых символов того или иного оператора подряд (комментарии, препроцессор, макросы, литералы не рассматриваются). Мой вопрос - с выходом стандарта C++11/14 изменился ли его ответ на эту задачу? Как я понимаю, теперь последовательность >>>> становится бесконечной - в шаблонах теперь не требуется вставлять пробел... Остальные операторы - вроде бы должны остаться неизменными. Но теперь в C++ конструкция && приобрела еще один смысл. В связи с этим - вопрос: осталось ли неизменным решение Саттера с пятью & подряд или теперь его можно превзойти? Это не соревнование, но если кто-то превзойдет Саттеровские решения - будет интересно посмотреть. Для справки: +,-,!,~,* - тривиальные бесконечные последовательности & - пять штук <,| - по четыре ... - даже не смешно :)<br>Да, получить два %% или там ^^ тоже просто: 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 не позволяет.