GCC版本差异:模板变量重定义在GCC10+报错但GCC7-9允许的原因咨询
模板变量重定义的GCC版本编译差异问题
以下代码在GCC 7至GCC 9版本中可正常编译,但在GCC 10及以上版本编译失败,具体原因如下:
template <typename R> inline constexpr bool foo = true; template <typename R> inline constexpr bool foo = false; int main() { return 0; }
GCC 10及以上版本的报错信息:
<source>:5:23: error: redefinition of 'template<class R> constexpr const bool foo' 5 | inline constexpr bool foo = false; | ^~~ <source>:3:23: note: 'template<class R> constexpr const bool foo<R>' previously declared here 3 | inline constexpr bool foo = true; | ^~~ ASM generation compiler returned: 1 <source>:5:23: error: redefinition of 'template<class R> constexpr const bool foo' 5 | inline constexpr bool foo = false; | ^~~ <source>:3:23: note: 'template<class R> constexpr const bool foo<R>' previously declared here 3 | inline constexpr bool foo = true; | ^~~ Execution build compiler returned: 1
原因分析
C++标准明确规定,同一个模板变量不能被重复定义,即便带有inline constexpr修饰符也不例外。模板变量属于模板实体,重复定义直接违反了单定义规则(ODR)。
GCC 7到GCC 9版本对这一标准规则的检查存在宽松处理,未严格拦截这种违规写法;而GCC 10开始严格遵循C++标准,对模板变量的重复定义进行了正确的报错拦截。
内容的提问来源于stack exchange,提问作者Lixin Wei
相关产品推荐
相关产品推荐

