相关疑难解决方法(0)

公共交换成员函数

复制和交换习语的漂亮答案中,有一段代码我需要一些帮助:

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静态的?它显然不使用任何成员变量.
  • "任何正确使用交换都会发现通过ADL进行交换"?ADL会搜索命名空间,对吧?但是它也看到了课程内部吗?或者在这里friend进来?

副题:

  • 随着C++ 11,我要记住我的swaps的noexcept
  • 随着C++ 11和它的范围,对,我应该将friend iter begin()friend iter end()在类中以同样的方式?我觉得friend这里不需要,对吗?

c++ friend copy-and-swap c++11

154
推荐指数
2
解决办法
2万
查看次数

为什么ADL没有找到功能模板?

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)

c++ template-function name-lookup argument-dependent-lookup

79
推荐指数
3
解决办法
3825
查看次数