是否保证在以下代码中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)
不,它没有保证.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构造函数未定义.
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |