【发布时间】: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)中的错误吗?我也无法理解为什么我的原始代码无法编译。
更新:这当然是愚人节玩笑。感谢所有参与讨论的人。我也感谢@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:override 和 final 不是关键字。它们是在特定上下文中出现时具有特殊含义的标识符。
-
据我所知,您将
final标记为final,这意味着您不能将其用作基类...您有理由相信这不应该是这种情况吗? -
@ShafikYaghmour 但是为什么其他变种会编译?
-
哇,所有这些严肃的答案。我真的是这里唯一一个认为这是愚人节恶作剧的人吗?
标签: c++ inheritance c++11 clang