Цепные вызовы функций-членов - порядок вызовов - PullRequest
2 голосов
/ 29 февраля 2012

У меня есть большое приложение, содержащее вызовы связанных функций, например:

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 ++ не определяет, когда параметры конфигурации для x и y извлекаются из объекта конфигурации.Действительно, когда я запускаю свое приложение в режиме отладки и выпуска (MS Visual Studio 2005), порядок вызовов Configuration::get противоположен.

Все было хорошо, пока мы не добавили поддержку возврата случайных значений из Configuration::get (для тестирования).Когда мы это сделали, поведение в режиме отладки и выпуска стало другим.

Так что мой вопрос:

Могу ли я решить эту проблему и все еще использовать цепочечные вызовы функций?(у нас есть много кода, написанного таким образом; было бы утомительно все это менять)

Могу ли я использовать, например, трюки с volatile?

1 Ответ

3 голосов
/ 29 февраля 2012

Нет, вы не можете. Порядок вычисления аргументов функции не определен, и с этим ничего нельзя поделать.

Вам придется разорвать цепочку, чтобы создать свои собственные точки последовательности, где важен этот порядок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...