我的std::exchange不在命名空间std中

My std::exchange is not in namespace std?

本文关键字:std 命名空间 exchange 我的      更新时间:2023-10-16

我在源文件中包含了<utility>。然后我使用了std::exchange,但编译器说它在命名空间std中没有找到exchange。我查看了usr/include/utility,通过搜索exchange我找到了实现,它在namespace std块中。我不得不从std::exchange中删除std::来编译代码。

我能解决这个问题吗?

否则,我如何使我的代码可移植?

注意:我使用的是安卓系统上Termux linux模拟器中的clang。我把它和apt一起安装,弄得叮当作响。

std::exchange是在C++14中引入的。如果您使用C++11,则该标准不提供它。

解决方案:使用符合C++14的实现(这可能需要显式启用支持,具体取决于它是否是默认的)。

否则我如何使我的代码可移植?

您可以自己实现它。以下是来自cppreference的一个可能的实现。

template<class T, class U = T>
T exchange(T& obj, U&& new_value)
{
T old_value = std::move(obj);
obj = std::forward<U>(new_value);
return old_value;
}