成员函数的链接调用 - 调用顺序

时间:2012-02-29 13:40:10

标签: c++ volatile method-chaining operator-precedence

我有一个包含链式函数调用的大型应用程序,如下所示:

subsystem.
    do_stuff(cfg().get("x")).
    do_stuff(cfg().get("y"));

此处subsystem是类类型的对象:

struct Sybsystem
{
    Sybsystem& do_stuff(int parameter)
    {
        ... // much code
        return *this; // this line makes it possible to chain calls
    }
};

此外,cfg()是一个"全局函数"返回一个配置对象:

struct Configuration
{
    int get(const char* param_name);
}
Configuration& cfg();

带链接函数调用的代码首先执行x,然后执行y;但是,C ++没有定义何时从配置对象中提取xy的配置参数。实际上,当我在调试和发布模式(MS Visual Studio 2005)中运行我的应用程序时,调用Configuration::get的顺序是相反的。

一切顺利,直到我们添加了对从Configuration::get返回随机值的支持(用于测试)。当我们这样做时,调试和发布模式中的行为变得不同。

所以我的问题是:

我可以修复此问题并仍使用链式函数调用吗? (我们用这种方式编写了很多代码;改变它们会很烦人)

我可以使用volatile

的技巧

1 个答案:

答案 0 :(得分:3)

不,你不能。函数参数的评估顺序是未指定的,你无能为力。

您必须打破链条以创建自己的序列点,此顺序非常重要。