Недавно тут пробегал вопрос о последовательностях операторов ++++ и ----. Навеяло...
У Саттера в "Новых сложных задачах" есть забавная задачка 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
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
При попытке указать больше - получим уже упомянутую ранее ошибку "ссылка на ссылку".
Т.о. побить рекорд Саттера для & появление новой семантики ссылок в c++11 не позволяет.
Комментариев нет:
Отправить комментарий