【问题标题】:ODR violation when name-lookup finds a different declaration名称查找发现不同声明时的 ODR 违规
【发布时间】:2011-05-16 07:35:27
【问题描述】:

我一直在考虑以下问题。考虑两个文件:

A.cpp:

template<class T> void g(T) {}

inline void f() { g(1); }

B.cpp:

template<class T> void g(T) {}
void g(int) {}

inline void f() { g(1); }

如果没有void g(int) {},这个程序是 100% 有效的。使用void g(int) {}g(1) 解析为 A.cpp 中的模板版本和 B.cpp 中的非模板版本。

此程序是否违反 ODR?为什么?

【问题讨论】:

  • 这是include 机制真正闪耀的地方:/
  • @Matthieu:这就是问题的来源。

标签: c++ one-definition-rule


【解决方案1】:

是的,确实如此。在inline 函数的例外中,它指定不仅内联函数的定义应由完全相同的标记序列组成,而且函数定义中的所有对应标识符在函数定义之外命名实体必须引用相同实体(有一些小的例外,例如引用具有相同定义的内部链接的 const 对象)。 [参见 ISO/IEC 14882:2003 3.2/5]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 2019-04-24
    相关资源
    最近更新 更多