当前位置:  开发笔记 > 编程语言 > 正文

std :: swap是否可以通过ADL查找非成员交换?

如何解决《std::swap是否可以通过ADL查找非成员交换?》经验,为你挑选了1个好方法。

Cors 11上的Torsten T. Will的教科书说,自C++ 11以来,如果定义了这样的非成员函数,std::swap将使用swapADL找到的非成员,因此模式

using std::swap;
swap (obj1, obj2);

总是可以用简单的代替

std::swap (obj1, obj2);

不幸的是,我没有在其他任何地方找到这样的声明.

真相是什么?



1> Nicol Bolas..:

从C++ 14(或更具体地说是N4140):

要求:类型T应为MoveConstructible(表20)和MoveAssignable(表22). 效果:交换存储在两个位置的值.

这里没有任何关于召集非会员的信息swap.所以不,没有std::swap通过非成员实施的保证swap.

目前还不完全清楚是否允许实现std::swap用户定义的非成员ADL swap.


我不确定某个特定的实现可以(合法地)执行此操作.它假定非成员`swap`产生所需的效果(交换两个对象的值).如果编译器可以看到非成员`swap`实现,并且如果它足够简单,编译器推断它确实交换了对象,那么我想它可以调用它.但我不认为编译器可以对非平凡的非成员`swap`函数做任何假设,因为它们是否真的交换了对象并不清楚.
推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有