什么是c ++内联类?

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.

希望它清晰而有说服力.

  • 我的眼睛!!+1虽然这是一个很好的和神秘的例子,当这工作.:) (3认同)
  • 你能详细说明WTF吗?为什么我会声明这样的函数,并且该函数是该类的方法? (2认同)

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作为函数说明符).

  • @Xeo:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2535.htm (3认同)

Eon*_*nil 9

我从Clang邮件列表中得到了答案.这是一个错误:http: //llvm.org/bugs/show_bug.cgi?id = 3941

但是它看起来已经在最近的版本中修复了.不管怎么说,还是要谢谢你 :)

这是对话:http: //lists.cs.uiuc.edu/pipermail/cfe-dev/2011-March/014207.html