gpt4 book ai didi

c++ - 名称查找发现不同声明时的 ODR 违规

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:22:03 29 4
gpt4 key购买 nike

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

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?为什么?

最佳答案

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

关于c++ - 名称查找发现不同声明时的 ODR 违规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6014349/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com