Пока я пытался понять, почему код вроде 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
}