Что такое встроенный класс C ++? - PullRequest
34 голосов
/ 22 марта 2011

Я случайно обнаружил, что компилятор Clang позволяет:

inline class AAA
{
};

в C ++. Что это?


PS. Я сообщил об этом в список рассылки Clang cfe-dev@cs.uiuc.edu, и теперь жду ответа. Я обновлю этот вопрос, когда мне сообщат.

Ответы [ 3 ]

36 голосов
/ 22 марта 2011

Это разрешено, если вы хотите объявить функцию, которая возвращает объект этого класса сразу после объявления класса, например:

#include <iostream>

inline class AAA 
{
public:
    AAA()
    {
        // Nothing
    }

    AAA(const AAA& _Param)
    {
        std::cout << "Calling Copy Constructor of AAA\n";
    }
}A()
 {
     AAA a;
     return a;
 };

int main()
{
    A();
    return 0;
}

Также вы должны заметить ошибки компилятора (или предупреждения)которые появляются в других недопустимых случаях, таких как объявление переменной вместо A(), также обратите внимание, что компилятор заявляет, что он игнорирует ключевое слово inline, если вы не объявили какую-либо функцию.

Надеюсь, что это полезно.

Редактировать: Для комментария Eonil

Если вы говорите о своем коде выше в вопросе, то это тот же самый случай, как я вижу, компиляторвыдает предупреждение: 'inline ' : ignored on left of 'AAA' when no variable is declared

Однако, если вы используете код в моем ответе, но замените A() на переменную, например, B, это сгенерирует ошибку компилятора: 'B' : 'inline' not permitted on data declarations

Итак, мы обнаруживаем, что компилятор не ошибся при принятии таких объявлений, как насчет попытки написать inline double; самостоятельно?Будет сгенерировано предупреждение: 'inline ' : ignored on left of 'double' when no variable is declared

А как насчет этого объявления:

double inline d()
{
}

Оно не выдает предупреждений или ошибок, оно точно так же, как:

inline double d()
{
}

с приоритет inline не имеет значения вообще.

Первый код (во всем ответе) похож на запись:

class AAA
{
    // Code
};

inline class AAA A()
{
    // Code
}

, что является законным.

И, иначе, его можно записать в виде:

class AAA
{
    // Code
};

class AAA inline A()
{
    // Code
}

Вам будет легче, если вы увидите первый код (ввесь ответ) написано так:

#include <iostream>

class AAA 
{
    // Code
} inline A()
 {
    // Code
 };

Но они одинаковы, так как не имеет значения для приоритета inline.

Надеюсь, что это ясно и убедительно.

14 голосов
/ 22 марта 2011

clang не должен допускать этого, inline может использоваться только в объявлении функций из ISO / IEC 14882: 2003 7.1.2 [dcl.fct.spec] / 1:

Спецификаторы функций могут использоваться только в объявлениях функций.

inline является одним из трех спецификаторов функций , virtual и explicit - остальные.

Как отмечает @MatthieuM, в следующей версии C ++ (C ++ 0x) ключевое слово inline также будет разрешено в определениях пространства имен (с различной семантикой inline).как спецификатор функции ).

9 голосов
/ 24 марта 2011

Я получил ответ из списка рассылки Clang.Это была ошибка: http://llvm.org/bugs/show_bug.cgi?id=3941

Однако, похоже, она уже была исправлена ​​в последней сборке.В любом случае спасибо:)

Вот разговор: http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-March/014207.html

...