c++ - 使用声明:gcc 和 clang 的另一个错误?
问题描述
为什么gcc HEAD 10.0.0 20190
都Clang HEAD 9.0.0
拒绝这个程序?
#include <iostream>
void g( int x )
{
std::cout << "Hello g( " << x << " )\n";
}
template <int N>
void g()
{
std::cout << "Hello g<N>( " << N << " )\n";
}
namespace N
{
using ::g;
}
void g( int x = 20 );
template <int N = 10>
void g();
int main()
{
N::g();
N::g<>();
}
例如gcc
发出错误
prog.cc: In function 'int main()':
prog.cc:27:11: error: no matching function for call to 'g()'
27 | N::g<>();
| ^
prog.cc:9:6: note: candidate: 'template<int N> void g()'
9 | void g()
| ^
prog.cc:9:6: note: template argument deduction/substitution failed:
prog.cc:27:11: note: couldn't deduce template parameter 'N'
27 | N::g<>();
| ^
尽管根据 C++ 20(和 17)标准(9.8 使用声明)
11 [注意:对于嵌套名称说明符命名命名空间的 using-declaration,在 using-declaration 之后添加到命名空间的成员不在引入的声明集中,因此在使用名称时不考虑它们制成。因此,在 using 声明之后添加的其他重载将被忽略,但会考虑默认函数参数 (9.2.3.6)、默认模板参数 (13.1) 和模板特化 (13.6.5, 13.8.3)。——尾注]
根据我对标准的阅读,我相信这是一个错误。
解决方案
这个问题是核心问题 1907的主题。当前的方向是将此类病例视为病态,无需诊断。
事实证明,一些实现在“每个实体”的基础上跟踪默认参数(因此很难不考虑在以后的重新声明中添加默认参数),而其他实现在“每个声明”的基础上跟踪它们(所以很难让他们考虑这样的默认参数)。CWG 决定通过对依赖于 IFNDR 的代码进行分类来适应这两种实施策略。
推荐阅读
- python - 附加列表相对于另一个列表时,条件语句不起作用
- python-3.x - 如何修复“参数必须支持迭代”以在 PyMySQL 输出上制表
- javascript - 从孩子到父母的反应钩子回调
- c++ - 使用 CMake 检索库及其版本的详尽列表
- css-grid - 如何使用 CSS 网格实现响应式布局
- javascript - React TypeError:skills.map 不是函数
- javascript - php 是否具有等效于 javascript 箭头函数 (=>) 的功能?
- model-view-controller - TYPO3 Extbase - 在缓存后操纵 TCA(使用信号槽/挂钩) - 可能吗?
- javascript - JS Javascript变量泄漏
- rust - 不能从 `std::iter::Iterator 构建类型为 `i32` 的集合
- `