Немножко отдельных фактов из одного доклада с C++ Russia.
1. Посмотрим на такой код:
delete [] { return new int; }();Скомпилируется ли этот код? Ответ: нет. А почему?
Семантически этот код можно считать корректным. Мы вызываем лямбду, которая возвращает нам указатель на выделенную память, которую тут же удаляем.
Давайте посмотрим на грамматику для [expr.delete]:
delete-expression:
:: opt delete cast-expression
:: opt delete [] cast-expressionТ.е. тут либо
delete с [expr.cast], либо delete []. Вроде всё корректно. У нас может быть выбрана первая альтернатива, потому выражение является корректным. Однако если почитать стандарт повнимательнее, мы увидимWhenever the delete keyword is immediately followed by empty square brackets, it shall be interpreted as the second alternative.Т.е. при наличии квадратных скобок после
delete, всегда должна выбираться вторая альтернатива. Впрочем, если посмотреть на ошибку от clang, с этой проблемой можно разобраться довольно быстро. 2. Из интересного ещё такой пример:
int override = 0; // ok
int private = 0; // errorПочему первое работает, а второе нет?
В языке есть специальные слова, которые не являются ключевыми. Они являются идентификаторами со специальным значением (
final, import, module, override). И если у компилятора есть сомнения, является ли это специальным значением, он разрешает это в пользу ответа нет. Т.е. подстраивается под существующий контекст. Эти два примера из очень приятного доклада Константина Владимирова про семантические процессы в C++.
У автора, кроме потрясающих курсов по плюсам на youtube, есть ещё канал в тг: @cpp_lects_rus.
Конфа в целом отсмотрена. Жду, когда выложат доклады в открытый доступ, и обязательно поделюсь тем, что понравилось.
=========================
У меня тут на днях google benchmark не хотел в cmake подтягиваться, потому что чуваки переименовали master в main. Вот она западная толлерантность. Из-за неё проекты не собираются.