以下代码是否具有明确定义的行为:
#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 是一个类而运算符/ 采用右值引用并且可以修改它时。
答案 0 :(得分:3)
您的代码与此代码相同,其中重载的运算符已解析:
file.operator=(operator/(dir, std::move(file));
这是安全的。在函数调用之前对函数参数的评估进行了排序,虽然方法主题的评估在参数方面没有排序,但是没有任何事情要做,因此file
的修改不会干扰简单地使用{{ 1}}作为左值。