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)