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

Что такое встроенный класс С++?

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

inline class AAA
{
};

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


PS. Я сообщил об этом в список рассылки Clang [email protected] и теперь жду ответа. Я обновлю этот вопрос, мне сообщили.

4b9b3361

Ответ 2

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

#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, если вы не сделали этого, t объявляет любую функцию.

Надеюсь, что это поможет.

Изменить: для комментария 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.

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

Ответ 3

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

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

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

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