On one hand, in general, a temporary object is destroyed at the end of the full-expression that it is part of.
To quote the draft of the standard N4140 Section 12.2:
Temporary objects are destroyed as the last step in evaluating the full-expression that (lexically) contains the point where they were created.
On the other hand, consider Case 1
#include <iostream>
#include <memory>
using std::cout;
using std::endl;
using std::shared_ptr;
void process(shared_ptr<int> p)
{
    std::cout << p.use_count() << std::endl;
}
int main()
{
    process(shared_ptr<int>(new int));
    return 0;
}
Or even simpler, as in Case 2
using std::cout;
using std::endl;
using std::shared_ptr;
int main()
{
    cout << shared_ptr<int>(shared_ptr<int>(new int)).use_count() << endl;
    return 0;
}
In either case, the output is 1. Not 2.
I feel somewhat confused at the output, and appreciate anyone who may offer some explanation.
My understanding for Case 1 is that shared_ptr<int>(new int) is a temporary object passed to process as an argument. According to the standard, it should not be destroyed before process makes its return. If that were the case, then the parameter p, which is initialized from the temporary, should have a use_count of 2 at the time of output, because at that time there are 2 objects managed by the shared_ptr.
My understanding for Case 2 follows the same logic.
It seems that there must be some mistakes in my understanding. Could someone please point them out? Thanks very much.
Note: There are several solved questions related to mine, but after reading them I am still confused. You may read this one for your reference.
 
    