Vla*_*cow 1 c++ using-declaration language-lawyer c++17
为什么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<>();
}
Run Code Online (Sandbox Code Playgroud)
例如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<>();
| ^
Run Code Online (Sandbox Code Playgroud)
尽管根据C ++ 20(和17)标准(9.8 using声明)
11 [注意:对于其嵌套名称说明符命名一个名称空间的使用声明,在使用声明之后添加到该名称空间的成员不在引入的声明集中,因此当使用该名称时,将不考虑这些成员。制作。因此,在using-声明之后添加的其他重载将被忽略,但会考虑默认函数参数(9.2.3.6),默认模板参数(13.1)和模板特殊化(13.6.5,13.8.3)。—尾注]
根据我对标准的阅读,我相信这是一个错误。
| 归档时间: |
|
| 查看次数: |
165 次 |
| 最近记录: |