以右值获取std::array大小为何GCC9编译通过GCC11报错?
问题根源
这个报错是全局变量名和标准库模板类名重名+GCC 11对模板内非依赖名称查找规则执行更严格共同导致的:
- 你的全局变量命名为
array,和std::array模板类同名 - 模板函数
parse中的array属于非依赖名称(不依赖模板参数string_type),会在模板定义阶段完成名称查找:- GCC 9.3.0的查找逻辑优先匹配到了全局作用域的变量
array,可以正常调用成员函数size() - GCC 11.2.0的查找逻辑优先匹配到了引入的
std::array类名,此时编译器会将array.size()错误解析为调用std::array的静态成员函数size,并隐式传入全局变量array的地址作为参数,因此会报「期望0参数,实际传入1个参数」的错误。
- GCC 9.3.0的查找逻辑优先匹配到了全局作用域的变量
修复方案
两种方案任选其一即可:
- 给全局变量改名,避免和标准库名称冲突,比如改成
arr:
#include<array> #include<cstdint> const std::array<int, 3> arr{0, 1 , 2}; template<class string_type> auto parse(string_type&& name) { const auto s = std::uint8_t{arr.size()}; return s; }
- 访问全局变量时显式指定全局作用域,明确告诉编译器要找的是全局变量而非
std::array类名:
template<class string_type> auto parse(string_type&& name) { const auto s = std::uint8_t{::array.size()}; return s; }
内容的提问来源于stack exchange,提问作者a_random_user
相关产品推荐
相关产品推荐

