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

Ker*_* SB 16 c++ undefined-behavior language-lawyer lvalue-to-rvalue c++11

我试图std::swap从[C++ 11:utility.swap]中了解条件.模板定义为

template <typename T> void swap(T &, T &)
Run Code Online (Sandbox Code Playgroud)

(加上一些noexcept细节)并具有"交换存储在两个位置的值"的效果.

以下程序是否有明确定义?

#include <utility>

int main()
{
    int m, n;
    std::swap(m, n);
}
Run Code Online (Sandbox Code Playgroud)

如果我自己编写交换代码(即int tmp = m; m = n; n = tmp;),它将具有未定义的行为,因为它将尝试对未初始化的对象进行左值到右值的转换.但标准std::swap函数似乎没有任何强加于它的条件,也不能从规范中得出有任何左值到右值并因此有UB.

标准是否需要std::swap执行一些在未初始化对象上明确定义的魔法?

为了澄清这一点,请考虑函数void f(int & n) { n = 25; },该函数从未具有未定义的行为(因为它不读取n).

Rei*_*ica 12

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

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

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

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

  • 问题是"无效值"没有明确定义.我怀疑它应该涵盖这样的案例. (2认同)

Evi*_*ach 1

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