c++有关拷贝函数和返回值优化的问题

共两个问题

第一个问题相关的代码:

Person returnP2 ()//问题2相关
{
    Person p2(10);//期望出现默认构造与析构
    return p2;
}

int main()
{
    Person p2 = returnP2();//希望出现拷贝构造
    
    cout << p2.age << endl;
    cout << p2.age << endl;
    cout << p2.age << endl; // 输出三次值成功,证明p2接收返回局部对象成功

此时输出为:

  有参构造:   
  10
  10
  10
  析构函数

问题1:这里是否是因为返回值优化,导致希望出现的拷贝构造这几个字眼没有出现


第二个问题相关的代码:(大致与上面相似,只是return后加了括号)

Person returnP2 ()
{
    Person p2(10);//期望出现默认构造与析构
    return (p2);
}

int main()
{
    

    Person p2 = returnP2();//希望出现拷贝构造
    
    cout << p2.age << endl;
    cout << p2.age << endl;
    cout << p2.age << endl; // 输出三次值成功,证明p2接收返回局部对象成功

此时输出为:

有参构造:   
拷贝构造:
析构函数
10
10
10
析构函数

问题2:return后面加括号有什么特殊意义吗,为什么这里成功调用了拷贝构造函数,没有被返回值优化


类中的成员如下:

class Person
{
public:
    int age = 0;
    
    Person()
    {
        cout << "默认构造" << endl;
    }

    Person(int val)
    {
        age = val;
        
        cout << "有参构造:   " << endl;
    }

    Person(const Person & p)
    {
        age = p.age;

        cout << "拷贝构造:  " << endl;
    }

    ~Person()
    {
        cout << "析构函数" << endl;
    }
};

软件为vsc,编译器gcc,标准为c++14
第一次在csdn问问题,如果格式上有问题望各位指出

gcc 不了解,说一下visual studio下的情况
首先括号代表表达式,如果表达式内容可以作为左值,返回的是表达式结果的引用,如果不能作为左值返回的是临时常量。
可以试一试 int a = 2; (a) = 3; a的结果是 3;
返回值优化的意思是return的内容直接和接收函数的变量对接,不经历中间的临时常量。比如 int fun(){int a = 1;return a;} int b = fun(); 如果没有返回值优化,fun()返回的内容是 临时常量(不妨叫c),在返回的过程中执行了 int c = a; b= c; 如果有返回值优化 则直接执行 b= a;