我有一个包含如此简单代码的小程序:
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;
以成为符合标准的。
答案 0 :(得分:14)
为什么你会期望它编译? final
是最终版,因此您无法继承它。
在您的其他代码中:
struct override final
{
};
这是定义一个没有基类的最终类,所以很好。
override : final
{
};
这是声明一个标签 override
,并在该标签处创建一个使用大括号final
初始化的{}
类型的prvalue临时值,这是立即销毁:
override:
final{};