Extending std
cppreference Extending the namespace std
NOTE: 原文的描述采用的枚举法;
Adding declarations to std
It is undefined behavior to add declarations or definitions to namespace std or to any namespace nested within std, with a few exceptions noted below
NOTE: 这说明我们不能直接向
std中添加declaration。
Adding template specializations
NOTE: 关于template specializaiton,参见
C++\Language-reference\Template\Specialization。
Class templates
It is allowed to add template specializations for any standard library class 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.
Function templates and member functions of templates
| version | |
|---|---|
It is allowed to add template specializations for any standard library function 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. |
(until C++20) |
| It is undefined behavior to declare a full specialization of any standard library function template. | (since C++20) |
Variable templates
NOTE: C++14引入的
补充
More C++ Idioms/Non-throwing_swap
Using non-throwing swap idiom for template classes (e.g.,
Matrix<T>) can be a subtle issue. As per the C++98 standard, only the full specialization ofstd::swapis allowed to be defined insidestdnamespace for the user-defined types. Partial specializations or function overloading is not allowed by the language. Trying to achieve the similar effect for template classes (e.g.,Matrix<T>) results into overloading ofstd::swapinstdnamepspace, which is technically undefined behavior.