gpt4 book ai didi

c++ - 函数调用顺序

转载 作者:太空狗 更新时间:2023-10-29 23:32:32 27 4
gpt4 key购买 nike

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

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());

最佳答案

不,不保证。 make_string() << GetLastError()在语义上等同于函数调用 operator<<( make_string(), GetLastError() ) , 函数参数的求值顺序未指定。

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

编辑

还有一个有趣的问题在评论中被多次提出,我认为值得解决。

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

make_string().operator<<(GetLastError());

这个说法确实是正确的。但是,上面的语句并没有排序!首先发生什么 - GetLastError()调用或make_sequence由于此处缺少排序,构造函数未定义。

关于c++ - 函数调用顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37687747/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com