Я случайно обнаружил, что компилятор Clang позволяет:
inline class AAA
{
};
в С++. Что это?
PS. Я сообщил об этом в список рассылки Clang [email protected]
и теперь жду ответа. Я обновлю этот вопрос, мне сообщили.
Я случайно обнаружил, что компилятор Clang позволяет:
inline class AAA
{
};
в С++. Что это?
PS. Я сообщил об этом в список рассылки Clang [email protected]
и теперь жду ответа. Я обновлю этот вопрос, мне сообщили.
Я получил ответ от списка рассылки Clang. Это была ошибка: http://llvm.org/bugs/show_bug.cgi?id=3941
Однако он уже исправлен в недавней сборке. Спасибо в любом случае:)
Здесь разговор: http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-March/014207.html
Это разрешено, если вы хотите объявить функцию, которая возвращает объект этого класса непосредственно после объявления класса, например:
#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
.
Надеюсь, это ясно и убедительно.
clang не должен допускать этого, inline
может использоваться только в декларации функций, из ISO/IEC 14882: 2003 7.1.2 [dcl.fct.spec]/1:
Спецификаторы функций могут использоваться только в объявлениях функций.
inline
является одним из трех спецификаторов функций, virtual
и explicit
являются другими.
Как отмечает @MatthieuM, в следующей версии С++ (С++ 0x) ключевое слово inline
также будет разрешено в определениях пространства имен (с другой семантикой до inline
как спецификатор функции).