【发布时间】:2014-08-11 17:17:06
【问题描述】:
我试图从 [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 读取的)。
【问题讨论】:
-
您的程序在调用
swap之前未定义m和n。定义它们不是swap的工作;swap的两个参数都应该被定义。所以我没有看到问题出在哪里。 -
好吧,至少对于 C++1y,我肯定会这么说 using and indeterminate int would be undefined。我认为
swap做的任何事情都不会改变这一点。我可能会说 C++11 的意图可能是相同的。唯一的例外是在无符号窄字符的情况下,它会保留其不确定的值。 -
@MikeDeSimone:嗯,这有点不可能实现,正如您从我的示例尝试中看到的那样......它在哪里说“两个参数都应该被定义”?跨度>
-
@ShafikYaghmour:
std::swap也要求库魔法,还是缺少一个条件? -
@ShafikYaghmour:我不关注...请查看我的更新。问题在呼叫现场没有表现出来;
f(a)完全有效。
标签: c++ c++11 language-lawyer undefined-behavior lvalue-to-rvalue