关于 cpp 的 copy-and-swap idiom 的问题

2019-09-12 22:57:37 +08:00
 alanlian

想问一下 https://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom/3279550#3279550 这个链接里的这个下面这段 public: friend 是怎么理解的呢? po 主尽力看了原回答给的链接,有些没有看懂。

class dumb_array
{
public:
    friend void swap(dumb_array& first, dumb_array& second) // nothrow
    {
        // enable ADL (not necessary in our case, but good practice)
        using std::swap;

        // by swapping the members of two objects,
        // the two objects are effectively swapped
        swap(first.mSize, second.mSize);
        swap(first.mArray, second.mArray);
    }
};
4218 次点击
所在节点    C++
27 条回复
secondwtq
2019-09-13 15:31:00 +08:00
这个不是重载的 std::swap,这个新函数应该是通过 ADL 被找到的
alanlian
2019-09-13 16:12:36 +08:00
@secondwtq https://stackoverflow.com/questions/11562/how-to-overload-stdswap 这个链接里的这个巨巨也是用的 overload 这个词呢?您看下
secondwtq
2019-09-13 17:18:04 +08:00
@alanlian 意思类似于:
Q:传输大文件用什么服务最吼?
A:顺丰快递
你感受一下

标准对 overload 的定义:“When two or more different declarations are specified for a single name **in the same scope**, that name is said to be overloaded.”
technically,你在使用 swap 的时候用了 overload resolution 的机制,overload resolution 在决定 candidate set 的时候会考虑 scope 和 ADL。不过 overload resolution 和 overloading 是两回事
alanlian
2019-09-13 17:33:51 +08:00
@secondwtq 这样子,我大概明白了,谢谢您了
secondwtq
2019-09-13 17:37:23 +08:00
其实应该说,你正确调用 swap 的时候,把 std::swap 重载了
另外 C++20 之前调 std::swap 应该是不会调到你的 swap 去的
baixiangcpp
2019-09-13 17:38:27 +08:00
《 EFFective C++》肯定没好好看
baixiangcpp
2019-09-13 17:41:00 +08:00
接上条,没写完就发了) 里边专门有个条款,就讲了 swap,虽然《 C++ primer 》也提过一嘴,但是一笔带过了.....

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/600536

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX