Подтвердить что ты не робот

Это новый стиль комментариев С++ 11?

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