函数顺序调用

Fro*_*art 2 c++

是否保证在以下代码中make_string调用GetLastError函数之前构造对象:

class make_string
{
public:
  template <typename T>
  make_string& operator<<(const T& arg)
  {
    _stream << arg;
    return *this;
  }

  operator std::string() const
  {
    return _stream.str();
  }

protected:
  std::ostringstream _stream;
};

// Usage
foo(make_string() << GetLastError());
Run Code Online (Sandbox Code Playgroud)

Ser*_*eyA 8

不,它没有保证.make_string() << GetLastError()在语义上等效于函数调用operator<<( make_string(), GetLastError() ),并且未指定函数参数的评估顺序.

因此,编译器可以先创建一个实例make_string,然后调用GetLastError(),然后调用所述make_string对象的成员函数,或者它可以先调用GetLastError(),然后创建一个实例,然后调用成员函数.根据我的经验,第二个结果更有可能.

编辑

在评论中也提出了一个有趣的问题,我认为值得解决.

声明是,既然operator<<是成员函数,整个语句在语义上与

make_string().operator<<(GetLastError());
Run Code Online (Sandbox Code Playgroud)

这种说法确实是对的.但是,上述声明中没有排序!首先发生了什么 - 由于缺少排序,GetLastError()调用或make_sequence构造函数未定义.