Оператор && для метки
Увидел необычную конструкцию в коде:
int main() {
L: goto *(&&L);
}
Что означает выражение *(&&L) для некоторой метки L?
Ответы (1 шт):
Круть какая!
Не могу не перевести ответ с английского стековерфлоу, потому что сам удивился, что не знал такой штуки:
- C++ Double Address Operator применительно к типу. Источник.
&& - новшество, появившееся в C++11. int&& a означает, что "a" является r-value ссылкой на значение r. && обычно используется только для объявления параметра функции. И для этого требуется только r-value значения.
Если Вы не знаете, что такое r-значение, простое объяснение состоит в том, что у него нет адреса памяти. Например. число 6 и символ 'v' являются r-value значениями. В выражении int a, a является l-value значением, однако (a+2) является r-value значением. Например:
void foo(int&& a)
{
//Some magical code...
}
int main()
{
int b;
foo(b); //Error. An rValue reference cannot be pointed to a lValue.
foo(5); //Compiles with no error.
foo(b+3); //Compiles with no error.
int&& c = b; //Error. An rValue reference cannot be pointed to a lValue.
int&& d = 5; //Compiles with no error.
}
- C++ Double Address Operator применительно к метке в коде. Источник.
Рассмотрим такой пример, где мы пытаемся получить адрес метки:
int main (void)
{
int i=1;
void* the_label_pointer;
the_label:
the_label_pointer = &the_label;
if( i-- )
goto *the_label_pointer;
return 0;
}
Стандарты C и C++ не поддерживают эту функцию. Однако GCC ( GNU GCC, для педантов) включает нестандартное расширение для этого, как описано в этой статье. По сути, они добавили специальный оператор «&&», который сообщает адрес метки как тип «void*».