将不再允许在C 20中为程序定义类型的std中的函数模板进行专门化吗?
作者:互联网
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.
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 regularstd::swap
forstd::vector<mytype>&
,
your specialization won’t get chosen over the standard’s vector
specificswap
, 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 dousing 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