c++11 - `final` 是否违反 ODR?
问题描述
// file1.cpp
struct Foo {
virtual void boo() final;
};
// file2.cpp
struct Foo {
virtual void boo();
};
这是 ODR,还是其他违反语言规则的行为?
解决方案
是的,这违反了适用于Foo
.
[basic.def.odr] 第 6 段:
如果每个定义出现在不同的翻译单元中,并且定义满足以下要求,则程序中可以有多个类类型的定义... [或在头文件中经常定义的其他实体] ... 给定这样一个
D
在多个翻译单元中定义的实体,那么
的每个定义
D
应由相同的标记序列组成;和... [确保所有定义在其上下文中具有相同含义的其他规则]
因此,预处理步骤之后类类型定义之间的任何差异都会给程序带来未定义的行为,甚至更改未使用的函数参数的名称、更改unsigned int
为int unsigned
等等。
推荐阅读
- amazon-web-services - 结合 dynamodb 流
- node.js - npm install aborts 在 CPanel 服务器上 - EBUSY syscall getaddrinfo
- r - 需要 r-markdown 的动态交互式折线图
- python - 警告:Tensorflow:只能在 f1 可用的情况下保存最佳模型,跳过
- javascript - JavaScript 表单验证(必需)
- c++ - C++ 私有继承与类
- python - FCGI htaccess 处理程序:找不到命令
- python - 在文本框中搜索 str 的模块接受任何匹配
- document - 从下一个文档中获取文档字段
- regex - 如何匹配第一个字母或数字后的所有制表符?