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

时间:2014-04-01 17:14:30

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

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

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在评论中指出的那样,这个代码至少存在一个问题,使其形成不良。第virtual override override;行违反了以下规则(参见标准的[basic.scope.class] 3.3.7 / 1段):

  

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

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

1 个答案:

答案 0 :(得分:14)

为什么你会期望它编译? final是最终版,因此您无法继承它。

在您的其他代码中:

struct override final
{

};

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

override : final
{

};

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

override:
    final{};