【问题标题】:Chained calls of member functions - order of calls [duplicate]成员函数的链式调用 - 调用顺序[重复]
【发布时间】:2012-02-29 13:40:09
【问题描述】:

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

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 返回随机值的支持(用于测试)之前,一切都很好。当我们这样做时,Debug 和 Release 模式下的行为变得不同了。

所以我的问题是:

我可以解决这个问题并仍然使用链式函数调用吗? (我们有很多这样写的代码;全部改掉会很累)

我可以使用volatile 等技巧吗?

【问题讨论】:

  • 我有点困惑,当您返回 随机值 时结果的不同可能会成为问题。结果肯定应该总是不同吗?
  • @LightnessRacesinOrbit 我使用带有恒定种子的伪随机生成器

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


【解决方案1】:

不,你不能。函数参数的求值顺序未指定,您对此无能为力。

你必须打破这个链条来创建你自己的序列点,这个顺序很重要。

【讨论】:

  • 这个答案已经过时了。有问题的问题已在 C++17 中修复。
猜你喜欢
  • 2022-01-23
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 2015-10-26
  • 2016-05-22
  • 2016-06-27
相关资源
最近更新 更多