使用声明:gcc和clang的另一个bug?

Vla*_*cow 1 c++ using-declaration language-lawyer c++17

为什么gcc HEAD 10.0.0 20190Clang 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)。—尾注]

根据我对标准的阅读,我相信这是一个错误。

T.C*_*.C. 6

本期是1907年核心期刊的主题。当前的方向是将这种情况视为病态,不需要诊断。

事实证明,有些实现以“每个实体”为基础跟踪默认参数(因此,很难不考虑在以后的重新声明中添加的默认参数),而另一些实现则以“每个声明”为基础进行跟踪(因此很难让他们考虑这样的默认参数)。CWG决定通过对依赖于IFNDR的代码进行分类来适应这两种实施策略。

  • 是的,需要花费时间起草和批准措辞以修复缺陷。特别是在优先级较高的项目(例如实际功能)时。 (4认同)