无意中发现Clang编译器允许:
inline class AAA
{
};
在 C++ 中。 这是什么?
PS。我将此报告给 Clang 邮件列表 cfe-dev@cs.uiuc.edu
,现在等待回复。我会在收到通知后更新这个问题。
最佳答案
如果您希望声明一个在类声明之后直接返回该类对象的函数,则允许这样做,例如:
#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':当没有变量时,'AAA' 左侧被忽略声明
但是,如果您使用我的答案中的代码,但将 A()
替换为变量,例如 B
,则会产生编译器错误: 'B' : 数据声明中不允许使用'inline'
所以我们发现编译器接受这样的声明没有错误,尝试自己编写inline double;
怎么样?它将产生一个警告:'inline': 当没有声明变量时,'double' 左侧被忽略
现在这个声明怎么样:
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
的优先级并不重要。
希望它清晰且令人信服。
关于c++ - 什么是 C++ 内联类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5388097/