问题 是否仍然可以通过在C ++ 0x中包含算法来定义std :: swap?


swap 功能模板已从中移除 <algorithm> 至 <utility> 在C ++ 0x中。前者是否在C ++ 0x中包含后者?或者它们都包含定义的公共头 swap

换句话说,以下代码是否保证在C ++ 0x中编译?

#include <algorithm>   // will this pull in std::swap?

// ...

using std::swap;
swap(a, b);

7075
2017-08-11 10:14


起源



答案:


FDIS(n3290),附件C,“兼容性”,C.2.7说:

17.6.3.2

影响原始功能:功能交换移动到不同的功能   头

基本原理:删除对<algorithm>的依赖性以进行交换。

E ff ect   原始功能:已编译的有效C ++ 2003代码   交换到<algorithm>可能必须包含<utility>。

所以不,它不能保证编译,这是故意改变。单个实现是否真的会破坏C ++ 03代码是另一回事。正如你所指出的那样,通过定义,它们不容易 swap 通过任一标题。但是可以选择将C ++ 03代码更容易地移植到C ++ 0x,而不是帮助人们编写严格符合C ++ 0x的代码。


15
2017-08-11 10:23



为什么没有 std::swap 总是住在里面 <utility>? :) - fredoverflow
委员会在这个问题上睡着了。许多算法在 <algorithm> 使用 swap,所以必须在范围内。我们应该保证这一点 <algorithm> 仍然拉进来 swap,因为在实践中它 总是 将。例如。 int i, j; std::iter_swap(&i, &j);  具有 上班! - Howard Hinnant
@Howard:一旦用户定义的类型发挥作用,它是正确的吗? 必须 是“真实的” std::swap 这些算法使用的,而不仅仅是其他一些具有交换值的代码,因为用户可能会专攻 std::swap 然后算法必须使用专业化? - Steve Jessop
@Steve:是的, std::swap 必须在范围内。但是把它放在你身上并不是一个好主意 swap 命名空间std中的重载。将它放在与您交换的对象相同的命名空间中。 swap 是其一部分 你的 对象的接口,与其赋值运算符没有区别。 - Howard Hinnant
@Howard:当然,我的意思是因为实现必须能够调用 std::swap 专业化,这将是一个非常奇特的实现,确实能够做到这一点,而无需偶然制作 std::swap 可用于TU的其余部分。 - Steve Jessop


答案:


FDIS(n3290),附件C,“兼容性”,C.2.7说:

17.6.3.2

影响原始功能:功能交换移动到不同的功能   头

基本原理:删除对<algorithm>的依赖性以进行交换。

E ff ect   原始功能:已编译的有效C ++ 2003代码   交换到<algorithm>可能必须包含<utility>。

所以不,它不能保证编译,这是故意改变。单个实现是否真的会破坏C ++ 03代码是另一回事。正如你所指出的那样,通过定义,它们不容易 swap 通过任一标题。但是可以选择将C ++ 03代码更容易地移植到C ++ 0x,而不是帮助人们编写严格符合C ++ 0x的代码。


15
2017-08-11 10:23



为什么没有 std::swap 总是住在里面 <utility>? :) - fredoverflow
委员会在这个问题上睡着了。许多算法在 <algorithm> 使用 swap,所以必须在范围内。我们应该保证这一点 <algorithm> 仍然拉进来 swap,因为在实践中它 总是 将。例如。 int i, j; std::iter_swap(&i, &j);  具有 上班! - Howard Hinnant
@Howard:一旦用户定义的类型发挥作用,它是正确的吗? 必须 是“真实的” std::swap 这些算法使用的,而不仅仅是其他一些具有交换值的代码,因为用户可能会专攻 std::swap 然后算法必须使用专业化? - Steve Jessop
@Steve:是的, std::swap 必须在范围内。但是把它放在你身上并不是一个好主意 swap 命名空间std中的重载。将它放在与您交换的对象相同的命名空间中。 swap 是其一部分 你的 对象的接口,与其赋值运算符没有区别。 - Howard Hinnant
@Howard:当然,我的意思是因为实现必须能够调用 std::swap 专业化,这将是一个非常奇特的实现,确实能够做到这一点,而无需偶然制作 std::swap 可用于TU的其余部分。 - Steve Jessop