【问题标题】:C++11 code with inheritance doesn't compile with clang具有继承的 C++11 代码不能使用 clang 编译
【发布时间】:2014-05-12 14:51:15
【问题描述】:

我有一个代码如此简单的小程序:

namespace override
{
    using final = void();
}

namespace final
{
    using override = void(int);

    struct final
    {
        virtual override override;
        virtual ::override::final override;
    };
}

int main()
{
    struct final final : ::final::final
    {
        ::final::override override override final;
        ::override::final override final override;
    };

    // doesn't compile
    struct override : final
    {

    };        
}

不幸的是它没有编译。我尝试使用以下代码对其进行编译:

// 1
struct override final
{

};

// 2    
override : final
{

};

这两种变体都可以正常编译。这是我的编译器(clang 3.4)中的错误吗?我也无法理解为什么我的原始代码无法编译。

live example

更新:这当然是愚人节玩笑。感谢所有参与讨论的人。我也感谢@ecatmur 的准确但过于严肃的回答。

我想得到看起来很奇怪的代码,同时至少可以用一个编译器编译(因为它会尊重我的问题)。所以我的目标不是创建符合标准的代码。但正如@Johannes Schaub - litb 在 cmets 中指出的那样,该代码至少存在一个问题,导致其格式错误。 virtual override override; 行违反了以下规则(参见标准的 [basic.scope.class] 3.3.7/1 段):

S 类中使用的名称 N 应在其上下文中引用相同的声明,并且在 S 的完整范围内重新评估时。违反此规则不需要诊断。

正如我所见,它可以重写为 virtual ::final::override override; 以符合标准。

【问题讨论】:

  • @JoachimPileborg 错误是error: base 'final' is marked 'final'。你指的是什么关键词?
  • @Jefffrey:overridefinal 不是关键字。它们是在特定上下文中出现时具有特殊含义的标识符
  • 据我所知,您将final 标记为final,这意味着您不能将其用作基类...您有理由相信这不应该是这种情况吗?
  • @ShafikYaghmour 但是为什么其他变种会编译?
  • 哇,所有这些严肃的答案。我真的是这里唯一一个认为这是愚人节恶作剧的人吗?

标签: c++ inheritance c++11 clang


【解决方案1】:

您为什么希望它编译? final 是最终的,所以你不能继承它。

在您的其他代码中:

struct override final
{

};

这是定义一个没有基类的最终类,所以没关系。

override : final
{

};

这是声明一个标签 override,并在该标签处创建一个类型为final 的prvalue 临时值,并使用大括号初始化器{} 进行初始化,该值立即被销毁:

override:
    final{};

【讨论】:

  • final 是最终版本吗?你在这里是什么意思?您对其他变体的解释非常有趣。但是标签变体对我来说太奇怪了......
  • 如果一个类是最终的,那么它不能被继承。这是 C++11 中的一个新特性。
  • 哦,就是这个意思。我知道了。对于final final 的课程内容你有什么想说的?
  • 它有两个虚函数,都叫override,一个是void()类型,另一个是void(int)类型,都覆盖了基类中override对应的重载,并且两者都标记为final,因此它们不能在任何进一步的派生类中被覆盖。
  • 太棒了!愚人节快乐(或更有可能的夜晚)!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 2015-01-29
相关资源
最近更新 更多