编程语言
首页 > 编程语言> > 将不再允许在C 20中为程序定义类型的std中的函数模板进行专门化吗?

将不再允许在C 20中为程序定义类型的std中的函数模板进行专门化吗?

作者:互联网

引自cppreference.com

Adding template specializations

It is allowed to add template specializations for any standard library |class (since C++20)| template to the namespace std only if the declaration depends on at least one program-defined type and the specialization satisfies all requirements for the original template, except where such specializations are prohibited.

这是否意味着,从C 20开始,将不再允许将函数模板的特化添加到用户定义类型的std命名空间?如果是这样,它意味着许多现有代码可能会破坏,不是吗? (在我看来,这是一种“激进”的改变.)此外,它会向这些代码注入未定义的行为,这不会触发编译错误(警告有希望).

解决方法:

现在看来它绝对是那样的.以前[namespace.std]包含

A program may add a template specialization for any standard library template to namespace std only if the declaration depends on a user-defined type and the specialization meets the standard library requirements for the original template and is not explicitly prohibited.

the current draft states

Unless explicitly prohibited, a program may add a template specialization for any standard library class template to namespace std provided that (a) the added declaration depends on at least one program-defined type and (b) the specialization meets the standard library requirements for the original template.

强调我的

看起来像Walter E. Brown撰写的论文Thou Shalt Not Specialize std Function Templates!对此负责.在其中,他详述了为什么要改变这一点的一些原因,例如:

  • Herb Sutter: “specializations don’t participate in overloading. […] If you want to customize a function base template and want that
    customization to participate in overload resolution (or, to always be
    used in the case of exact match), make it a plain old function, not a
    specialization. And, if you do provide overloads, avoid also providing
    specializations.”
  • David Abrahams: “it’s wrong to use function template specialization [because] it interacts in bad ways with overloads. […] For example,
    if you specialize the regular std::swap for std::vector<mytype>&,
    your specialization won’t get chosen over the standard’s vector
    specific swap, because specializations aren’t considered during
    overload resolution.”
  • Howard Hinnant: “this issue has been settled for a long time. . . . Disregard Dave’s expert opinion/answer in this area at your own
    peril.”
  • Eric Niebler: “[because of] the decidedly wonky way C++ resolves function calls in templates. . . , [w]e make an unqualified call to
    swap in order to find an overload that might be defined in […]
    associated namespaces[…] , and we do using std::swap so that, on
    the off-chance that there is no such overload, we find the default
    version defined in the std namespace.”
  • High Integrity C++ Coding Standard: “Overload resolution does not take into account explicit specializations of function templates. Only
    after overload resolution has chosen a function template will any
    explicit specializations be considered.”

标签:c20,function-templates,c,std,template-specialization
来源: https://codeday.me/bug/20190928/1828708.html