从 libstdc++<concepts>
头文件:
namespace ranges
{
namespace __cust_swap
{
template<typename _Tp> void swap(_Tp&, _Tp&) = delete;
Run Code Online (Sandbox Code Playgroud)
从 MS-STL<concepts>
标头:
namespace ranges {
namespace _Swap {
template <class _Ty>
void swap(_Ty&, _Ty&) = delete;
Run Code Online (Sandbox Code Playgroud)
我从未遇到过= delete;
要禁止调用复制/移动赋值/ctor 的上下文之外的情况。
我很好奇这是否有必要,所以我= delete;
像这样注释了库中的部分:
// template<typename _Tp> void swap(_Tp&, _Tp&) = delete;
Run Code Online (Sandbox Code Playgroud)
看看下面的测试用例是否编译。
#include <concepts>
#include <iostream>
struct dummy {
friend void swap(dummy& a, dummy& b) {
std::cout << "ADL" << std::endl;
}
};
int main()
{
int a{};
int …
Run Code Online (Sandbox Code Playgroud) 正确使用std :: swap是:
using std::swap;
swap(a,b);
Run Code Online (Sandbox Code Playgroud)
它有点冗长,但它确保如果a,b有更好的交换定义它将被选中.
所以现在我的问题是为什么std::swap
没有使用这种技术实现,所以用户代码只需要调用std::swap
?
所以这样的事情(noexcept
为了简洁而忽略和约束):
namespace std {
namespace internal {
template <class T> // normal swap implementation
void swap(T& a, T& b) { // not intended to be called directly
T tmp = std::move(a);
a = std::move(b);
b = std::move(tmp);
}
}
template <class T>
void swap(T& a, T& b) {
using internal::swap;
swap(a,b);
}
}
Run Code Online (Sandbox Code Playgroud) c++ template-function argument-dependent-lookup customization-point