操作员的排序规则和副作用

时间:2017-06-20 14:09:04

标签: c++ c++11

以下代码是否具有明确定义的行为:

#include <boost/filesystem.hpp>
...
void foo (fs::path const& dir, fs::path file)
{
  file = dir / std::move (file); // Is it ok?
}

如果我们假设我们operator/ (path const& a, path&& b)修改了它的第二个右值参数?

PS。这不是特定于推特的问题。 Boost文件系统库仅用作可能出现此类问题的上下文的示例。问题是关于在C ++中使用x = y / move(x)表达式的安全性,当 x,y 是一个类而运算符/ 采用右值引用并且可以修改它时。

1 个答案:

答案 0 :(得分:3)

您的代码与此代码相同,其中重载的运算符已解析:

file.operator=(operator/(dir, std::move(file));

这是安全的。在函数调用之前对函数参数的评估进行了排序,虽然方法主题的评估在参数方面没有排序,但是没有任何事情要做,因此file的修改不会干扰简单地使用{{ 1}}作为左值。