Можно ли изменить порядок передачи функций в функцию

int func1(int a, b)
{
    return a + b;
}
int func2(int a)
{
    return a + 2;
}
int func3(int a)
{
    return a * 2;
}
int main()
{
    for(int i = 0;i < 10;i++)
    {
        std::cout << func1(func2(i), func3(i));
    }
}

Когда я отлаживал подобный код то заметил что в функцию func1 первым аргументом передаётся func3 а затем func2 для меня это проблема т.к. я написал относительно большой код не учитывая этой особенности языка, и теперь меня интересует можно-ли как-то изменить порядок передачи в функцию что бы сначала выполнилась func2 затем func3 а после func1


Ответы (1 шт):

Автор решения: KoVadim

В стандарте с++ порядок вычисления аргументов не определен и компилятор имеет право вычислять в любом порядке.

Делайте просто предварительное вычисление

int func1(int a, b)
{
    return a + b;
}
int func2(int a)
{
    return a + 2;
}
int func3(int a)
{
    return a * 2;
}
int main()
{
    for(int i = 0;i < 10;i++)
    {
        auto a1 = func2(i);
        auto a1 = func3(i)
        std::cout << func1(a1, a2);
    }
}

Если же функции возвращают что то сложное (например, std::vector по значению с миллионом элементов), возможно нужно будет использовать rvalue ссылки с move семантикой, что бы улучшить производительность.

→ Ссылка