хранить новые объекты в интеллектуальных указателях в автономном выражении

Я просматривал статью 17 Эффективного C++ 3-го издания.

В нем упоминается тот порядок, в котором выполняются аргументы для вызова функции:

processWidget(std::tr1::shared_ptr<Widget> pw(new Widget), priority());

может быть:

1) Выполнить «новый виджет» 2) Приоритет вызова 3) Вызов tr1::shared_ptr c'tor.

Действительно ли это так в последних компиляторах C++. Я имею в виду, я твердо уверен, что компилятор должен вызывать шаги 1 и 3 один за другим, а не как в приведенном выше случае, поскольку это один единственный аргумент. Пожалуйста, поправьте меня, если я неправильно понимаю. Кроме того, если кто-то задал этот вопрос, вы можете перенаправить его на эту страницу, так как я не нашел ничего в SO.


person facebook-100001358991487    schedule 16.03.2019    source источник
comment
Это не так в С++ 17.   -  person Passer By    schedule 16.03.2019
comment
Хорошее чтение: Почему в С++ нет заданный порядок оценки аргументов функции?   -  person user4581301    schedule 16.03.2019
comment
Мне понадобилось больше времени, чем следовало бы, чтобы отследить это. Каковы гарантии порядка оценки, введенные C++ 17?< /а>   -  person user4581301    schedule 16.03.2019
comment
@PasserBy, могу ли я сказать, что утечки памяти не будет? или мне не нужно добавлять автономный оператор перед вызовом функции, как указано в моей прикрепленной ссылке?   -  person facebook-100001358991487    schedule 16.03.2019
comment
Дело не в последних компиляторах, а в том, что вы включаете С++ 17. Если вы используете новейший компилятор и не настроили его для компиляции в C++17, такой гарантии нет.   -  person Mirko    schedule 16.03.2019
comment
Да. Но семантика часто понимается неправильно. Обратите также внимание, что std::make_shared не только предотвращает утечку памяти до C++17, но и объединяет выделения памяти, что не всегда является лучшим вариантом.   -  person Passer By    schedule 16.03.2019