Пока я пытался понять, почему код вроде int(*)();
компилируется отлично с g++, я обнаружил еще более странную вещь:
int main()
{
int(*){} Is it C++11 or any other language?
}
Этот код компилируется с помощью g++ 4.8.1, см. живой пример (флаги: -std=c++11 -pedantic-errors
). Ни clang 3.4, ни vС++ 2013 не компилируют его.
Является ли это новым стилем комментариев С++ 11, который поддерживается только g++? Или ошибка компилятора?
Вот что я узнал о таком стиле "комментариев":
-
Обычная структура комментария (части, которые можно опустить, заключены в скобки
[ ... ]
):int // or another valid C++ type (*) // or another sequence of '*' and/or '&' characters with nonzero length {"[Comment header]"} [Comment body] {[Comment footnote]}
-
Вместо использования символа окончания строки
;
можно использовать:int(*){} Comment ;
. - Если комментарий является последней конструкцией в блоке
{ ... }
, оба оканчивающегося символа и сноски можно опустить:{ int(*){} Comment }
. - Допустимыми символами являются цифры, английские буквы и символы из следующего списка:
- + * / % & | ^ ~ = . , : ! ? $ ( ) [ ] < >
. - Внутри тела комментария или сноски не допускаются следующие символы:
; { } # @
. - Символьные литералы
'...'
и строковые литералы"..."
разрешены внутри тела комментария или сноски, но сами символы'
и"
не могут использоваться отдельно. -
Обычные комментарии С++
// ...
и/* ... */
отлично работают с новыми "комментариями". Директивы препроцессора, макросы, орграфы и триграфы тоже работают отлично (живой пример):#define TerminatingSymbol ; int(*) ??< %> // a pair of trigraph and digraph "This is a string" // string literal #if 1 Comment #endif TerminatingSymbol std::cout << "Hello, "; int(*){} /* Character literal: */ 'c' <% ??> std::cout << "world!" << std::endl;
-
Я не мог понять, как работают литералы с плавающей запятой внутри таких "комментариев".
Следующий пример кода иллюстрирует возможности новых "комментариев":
#include <iostream>
int main()
{
void(*){} do not try this float; // simple C++ keywords are allowed, of course
std::cout << "1";
int(&){"Allowed characters"}
- + * / % & | ^ ~ = . , : ! ? $ ( ) [ ] < > ; // ';' itself is not allowed
std::cout << "2";
char(************************************)
{"William Blake wrote:"}
Tyger! Tyger! burning bright
In the forests of the night,
What immortal hand or eye
Could frame thy fearful symmetry?
{"The Tyger", 1794}
std::cout << "3";
float(*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*)
{"Some formulas"}
2 x 2 = 4
pi ~= 3.145926 ...
E = m * c ^ 2
a ^ n + b ^ n != c ^ n, n > 2
{42}
std::cout << "4";
unsigned(*(*(*(*(*(*(*(*(*(*())))))))))){}
It is a last comment
}