swap()会导致未定义的行为吗?

时间:2014-06-20 21:26:42

标签: c++ c++11 language-lawyer undefined-behavior lvalue-to-rvalue

我试图从[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读取)。

2 个答案:

答案 0 :(得分:12)

非常好的问题。但是,我会说[res.on.arguments]§1:

涵盖了这一点
  

以下各项适用于C ++标准库中定义的函数的所有参数,除非   另有明确说明。

     
      
  • 如果函数的参数具有无效值(例如函数域之外的值)   或者指针对其预期用途无效),行为未定义。
  •   

为了解决您对f(n)的疑虑,您问题中的函数f不是C ++标准库的一部分,因此上述条款不适用于它。

答案 1 :(得分:1)

由于M的值未定义,我希望它会污染对swap的调用。 当调用交换时,鼻子可能会飞行。