Что это за улыбка-с-бородой выражение:""?


я наткнулась на следующую программу, которая компилируется без ошибок или даже предупреждений:

int main(){
  <:]{%>; // smile!
}

живой пример.

что делает программа, и что это за смайлик-выражение?

4 290

4 ответа:

Это пустая лямбда, использующая маскировку орграфа. У обычных лямбд нет бороды.

программа использует орграфы чтобы представить следующее:

[] {};

это лямбда-выражение, которое ничего не делает. Соответствующие символы имеют следующие эквиваленты:

<: = [
%> = }

хотя они, как правило, не нужны сегодня, орграфы полезны, когда на вашей клавиатуре нет определенных клавиш, необходимых для использования базового исходного набора символов C++, а именно графических. Комбинация символов, составляющих орграф, обрабатывается как единое целое знак. Это, в свою очередь, компенсирует любые недостаточно оборудованные клавиатуры или другое подобное оборудование или программное обеспечение.

программа использует орграфы, которые позволяют программировать C++ с клавиатурами (или текстовыми кодировками), которые могут не иметь символов, обычно используемых C++.

код разрешает это:

int main(){
  []{}; // smile!
}
int main(){
  <:]{%>; // smile!
}

это лямбда-выражение (лямбда-выражение является одним из C++11 функции) с помощью орграфы (оба орграфа и триграфы работают на C++):

[] {};

используя только орграфы:

<:]<%}; 

<:]<%%>;

[:>{%>; // like my cubic hat?

[:><%};

[:><%%>;

смешивая их с Триграфов:

<:??)<%??>; // popeye

??(:>{??>; // pirate