What's the c++ inline class?
Solution 1
I got an answer from Clang mailing list. It was a bug: http://llvm.org/bugs/show_bug.cgi?id=3941
However it looks already been fixed in recent build. Thanks anyway :)
Here's the conversation: http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-March/014207.html
Solution 2
It's allowed in case you wish to declare a function that returns an object of that class directly after the class' declaration, for example :
#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;
}
Also you should notice the compiler errors (or warnings) that appear in other illegal cases, such as declaring a variable instead of A()
, also notice that the compiler states that it ignores the inline
keyword if you didn't declare any function.
Hope that's helpful.
Edit : For The comment of Eonil
If you are talking about your code above in the question, then it's the same case as I see, the compiler will give you a warning : 'inline ' : ignored on left of 'AAA' when no variable is declared
However, if you use the code in my answer but replace A()
with a variable, B
for example, it will generate a compiler error : 'B' : 'inline' not permitted on data declarations
So we find that the compiler made no mistake with accepting such declarations, how about trying to write inline double;
on its own? It will generate a warning : 'inline ' : ignored on left of 'double' when no variable is declared
Now how about this declaration :
double inline d()
{
}
It gives no warnings or errors, it's exactly the same as :
inline double d()
{
}
since the precedence of inline
is not important at all.
The first code (in the whole answer) is similar to writing :
class AAA
{
// Code
};
inline class AAA A()
{
// Code
}
which is legal.
And, in other way, it can be written as :
class AAA
{
// Code
};
class AAA inline A()
{
// Code
}
You would be relieved if you see the first code (in the whole answer) written like :
#include <iostream>
class AAA
{
// Code
} inline A()
{
// Code
};
But they are the same, since there is no importance for the precedence of inline
.
Hope it's clear and convincing.
Solution 3
clang shouldn't allow this, inline
can only be used in the declaration of functions, from ISO/IEC 14882:2003 7.1.2 [dcl.fct.spec] / 1 :
Function-specifiers can be used only in function declarations.
inline
is one of three function-specifiers, virtual
and explicit
being the others.
As @MatthieuM notes, in the next version of C++ (C++0x), the inline
keyword will also be allowed in namespace definitions (with different semantics to inline
as a function-specifier).
![eonil](https://i.stack.imgur.com/PZwCJ.jpg?s=256&g=1)
eonil
Favorite words: "Make it work, make it right, make it fast" — by Kent Beck? "...premature optimization is the root of all evil (or at least most of it) in programming." - from The Art of Computer Programming, by Donald Knuth. "Yes, but your program doesn't work. If mine doesn't have to work, I can make it run instantly and take up no memory." — from Code Complete, by Steve Mcconnell. "Flat is better than nested." — from The Zen of Python, by Tim Peters "Making decisions is slow." — from The Ninja build system manual, author unknown. "A little copying is better than a little dependency." - from Go Proverbs, by Rob Pike Preferred tools: macOS, iOS, Ubuntu. Rust, Swift, VIM, Xcode. SQLite, PostgreSQL, Redis. And a few more trivial stuffs. Feel free to fix my grammar. I always appreciate!
Updated on August 16, 2022Comments
-
eonil almost 2 years
I accidentally found that the Clang compiler allows :
inline class AAA { };
in C++. What's this?
PS. I reported this to Clang mailing list
[email protected]
, and now waiting for reply. I'll update this question by I'm informed. -
Matthieu M. over 13 yearsIn the context of C++0x, it can be used with namespaces too.
-
Xeo over 13 years@Matthieu: Could you expand on that?
-
Xeo over 13 yearsMy eyes!! +1 though for a nice and cryptic example when this works. :)
-
polemon over 13 yearsCould you elaborate WTF, is happening here? Why would I ever declare a function like that, and is that function a method of the class?
-
Tamer Shlash over 13 years@polemon: This function is not a method of that class, it's a function on its own, you could declare funciton or variable immediately after the closing brace and before the semicolon
;
and it (the function) will return an object of that class (and the variable will be an object of that class). And for reason, I don't actually have any reason for functions, there may be some reasons for variables, yet I don't have any of them in mind right now. -
Nicholas Knight over 13 years@Mr.TAMER's particular construct might be legal (and it's definitely crazy), but if there's no function, I think the compiler ought to reject it, not warn about it. (And the clang version with Xcode4 does neither.) This still smells like a bug to me. Does anyone have chapter&verse from the standard on this?
-
eonil over 13 yearsGreat description. But unfortunately, I tried to compile exactly same code which I instanced. And Clang did compile it without any error. So obviously it's not this case.
-
Chef Pharaoh almost 6 years@TamerShlash Is this allowed in c++11? I get some linker errors saying undefined reference.
-
Admin almost 3 yearsMight be helpful to clarify that "It's allowed in case you wish to declare a inline function..."