Eon*_*nil 36 c++ inline class clang
我不小心发现Clang编译器允许:
inline class AAA
{
};
Run Code Online (Sandbox Code Playgroud)
在C++中.这是什么?
PS.我向Clang邮件列表报告了这个cfe-dev@cs.uiuc.edu,现在正在等待回复.我知道了,我会更新这个问题.
Tam*_*ash 37
如果您希望声明一个在类声明后直接返回该类对象的函数,则允许它,例如:
#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;
}
Run Code Online (Sandbox Code Playgroud)
此外,您应该注意到在其他非法情况下出现的编译器错误(或警告),例如声明变量而不是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()
{
}
Run Code Online (Sandbox Code Playgroud)
它没有给出任何警告或错误,它与以下内容完全相同:
inline double d()
{
}
Run Code Online (Sandbox Code Playgroud)
因为优先权inline根本不重要.
第一个代码(在整个答案中)与写作类似:
class AAA
{
// Code
};
inline class AAA A()
{
// Code
}
Run Code Online (Sandbox Code Playgroud)
这是合法的.
而且,换句话说,它可以写成:
class AAA
{
// Code
};
class AAA inline A()
{
// Code
}
Run Code Online (Sandbox Code Playgroud)
如果您看到第一个代码(在整个答案中)写得如下,您会感到宽慰:
#include <iostream>
class AAA
{
// Code
} inline A()
{
// Code
};
Run Code Online (Sandbox Code Playgroud)
但它们是相同的,因为对于优先权没有重要性inline.
希望它清晰而有说服力.
CB *_*ley 14
clang不应该允许这样,inline只能在功能声明中使用,来自ISO/IEC 14882:2003 7.1.2 [dcl.fct.spec]/1:
函数说明符只能在函数声明中使用.
inline是三个函数说明符之一,virtual并且explicit是其他函数说明符.
正如@MatthieuM所指出的,在下一版本的C++(C++ 0x)中,inline关键字也将被允许在命名空间定义中(具有不同的语义inline作为函数说明符).
我从Clang邮件列表中得到了答案.这是一个错误:http: //llvm.org/bugs/show_bug.cgi?id = 3941
但是它看起来已经在最近的版本中修复了.不管怎么说,还是要谢谢你 :)
这是对话:http: //lists.cs.uiuc.edu/pipermail/cfe-dev/2011-March/014207.html
| 归档时间: |
|
| 查看次数: |
19564 次 |
| 最近记录: |