【问题标题】:What's the c++ inline class?什么是 C++ 内联类?
【发布时间】:2011-07-20 06:35:03
【问题描述】:

无意中发现Clang编译器允许:

inline class AAA
{
};

在 C++ 中。 这是什么?


PS。我将此报告给 Clang 邮件列表cfe-dev@cs.uiuc.edu,现在等待回复。我会在收到通知后更新这个问题。

【问题讨论】:

  • 内联函数有意义....但是内联类??
  • “这是什么?” - 标准 C++ 中不存在的东西。 inline 说明符用于函数,而不是类。您可能偶然发现了 Clang C++ 编译器中的一个错误。
  • 添加了clang标签,我在错误跟踪器上找不到任何东西,可能值得打开一个(你总是可以事先向 cfe-dev [at] cs.uiuc.edu 发邮件如果你不确定)。如果这是在 2.9 行,他们可能会想尽快修复它。
  • 这可能是告诉编译器不要为您定义的类生成面向对象的代码。也许它将类声明和内存管理扩展到用户代码中以加快速度。
  • 他们回答这是一个错误。不过已经修好了。

标签: c++ class inline clang


【解决方案1】:

如果您希望声明一个在类声明之后直接返回该类对象的函数,则允许这样做,例如:

#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 的优先级并不重要。

希望它清晰且令人信服。

【讨论】:

  • 我的眼睛!! +1 虽然这是一个很好的和神秘的例子,当它起作用时。 :)
  • 你能详细说明一下 WTF,这里发生了吗?为什么我要声明这样的函数,而该函数是类的方法吗?
  • @polemon:这个函数不是那个类的方法,它本身就是一个函数,你可以在右大括号之后和分号;之前声明函数或变量,它(函数)将返回该类的对象(并且变量将是该类的对象)。至于原因,我实际上对函数没有任何理由,可能有一些变量的原因,但我现在没有任何考虑。
  • @Mr.TAMER 的特殊构造可能是合法的(而且它绝对很疯狂),但如果没有函数,我认为编译器应该reject 它,而不是警告它。 (而带有 Xcode4 的 clang 版本两者都没有。)这对我来说仍然像一个错误。有人有这方面的标准章节吗?
  • 很好的描述。但不幸的是,我试图编译我实例化的完全相同的代码。 Clang 确实编译它没有任何错误。所以显然不是这种情况。
【解决方案2】:

clang 不允许这样做,inline 只能用于函数声明中,来自 ISO/IEC 14882:2003 7.1.2 [dcl.fct.spec] / 1:

函数说明符只能在函数声明中使用。

inline 是三个函数说明符之一,virtualexplicit 是其他的。

正如@MatthieuM 所说,在下一版本的 C++ (C++0x) 中,inline 关键字也将被允许在命名空间定义中使用(与 inline 的语义不同,作为 函数说明符)。

【讨论】:

  • 在 C++0x 的上下文中,它也可以与命名空间一起使用。
  • @Matthieu:你能详细说明一下吗?
【解决方案3】:

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

但它看起来已经在最近的版本中得到修复。 无论如何谢谢:)

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

【讨论】:

    猜你喜欢
    • 2010-12-05
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    相关资源
    最近更新 更多