带继承的C++ 11代码不能用clang编译

Con*_*tor 8 c++ inheritance clang c++11

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

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
    {

    };        
}
Run Code Online (Sandbox Code Playgroud)

不幸的是它没有编译.我尝试使用以下代码编译它:

// 1
struct override final
{

};

// 2    
override : final
{

};
Run Code Online (Sandbox Code Playgroud)

这两种变体都编译得很好.在我的编译器(clang 3.4)中是错误的吗?我不明白为什么我的原始代码无法编译.

查看实例.

更新:这当然是愚人节的笑话.感谢所有参与讨论的人.我还要感谢@ecatmur他的确切但非常认真的答案.

我想获得看起来很奇怪的代码,同时至少会编译一个编译器(因为它会让我的问题更加尊重).所以我的目标不是创建符合标准的代码.但正如@Johannes Schaub - litb在评论中指出的那样,这个代码至少存在一个问题,使其形成不良.该行virtual override override;违反了以下规则(参见标准的[basic.scope.class] 3.3.7/1段):

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

我可以看到它可以被重写为virtual ::final::override override;成为符合标准的.

eca*_*mur 14

你为什么期望它编译?final是最后的,所以你不能继承它.

在您的其他代码中:

struct override final
{

};
Run Code Online (Sandbox Code Playgroud)

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

override : final
{

};
Run Code Online (Sandbox Code Playgroud)

这是声明一个标签 override,并在该标签处创建一个final使用brace-initializer初始化的类型的prvalue临时值{},该值立即被销毁:

override:
    final{};
Run Code Online (Sandbox Code Playgroud)