我试图从[C ++ 11:utility.swap]中了解std::swap
的条件。模板定义为
template <typename T> void swap(T &, T &)
(加上一些noexcept
详细信息)并具有“交换存储在两个位置的值”的效果。
以下程序是否有明确的定义?
#include <utility>
int main()
{
int m, n;
std::swap(m, n);
}
如果我自己编写交换代码(即int tmp = m; m = n; n = tmp;
),它将具有未定义的行为,因为它将尝试对未初始化的对象进行左值到右值的转换。但标准的std::swap
函数似乎没有任何强加于它的条件,也不能从规范中得出有任何左值到右值并因此有UB。
标准是否要求std::swap
执行一些在未初始化对象上明确定义的魔法?
为了澄清这一点,请考虑函数void f(int & n) { n = 25; }
,它从未具有未定义的行为(因为它不从n
读取)。
答案 0 :(得分:12)
非常好的问题。但是,我会说[res.on.arguments]§1:
涵盖了这一点以下各项适用于C ++标准库中定义的函数的所有参数,除非 另有明确说明。
- 如果函数的参数具有无效值(例如函数域之外的值) 或者指针对其预期用途无效),行为未定义。
为了解决您对f(n)
的疑虑,您问题中的函数f
不是C ++标准库的一部分,因此上述条款不适用于它。
答案 1 :(得分:1)
由于M的值未定义,我希望它会污染对swap的调用。 当调用交换时,鼻子可能会飞行。