在复制和交换习语的漂亮答案中,有一段代码我需要一些帮助:
class dumb_array
{
public:
// ...
friend void swap(dumb_array& first, dumb_array& second) // nothrow
{
using std::swap;
swap(first.mSize, second.mSize);
swap(first.mArray, second.mArray);
}
// ...
};
Run Code Online (Sandbox Code Playgroud)
他补充说明
还有其他声称我们应该专门为我们的类型使用std :: swap,提供一个类内交换以及一个自由函数交换等等.但这都是不必要的:任何正确使用swap都将通过一个不合格的调用,我们的功能将通过ADL找到.一个功能就可以了.
随着friend我对"不友好"的条款一点,我必须承认.所以,我的主要问题是:
swap静态的?它显然不使用任何成员变量.friend进来?副题:
swaps的noexcept?friend iter begin()和friend iter end()在类中以同样的方式?我觉得friend这里不需要,对吗?C++规范的哪一部分限制参数依赖查找在相关命名空间集合中查找函数模板?换句话说,为什么main下面的最后一次调用无法编译?
namespace ns {
struct foo {};
template<int i> void frob(foo const&) {}
void non_template(foo const&) {}
}
int main() {
ns::foo f;
non_template(f); // This is fine.
frob<0>(f); // This is not.
}
Run Code Online (Sandbox Code Playgroud)