Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么没有为匿名对象调用析构函数?_C++_Oop_C++11_Copy Constructor_Anonymous - Fatal编程技术网

C++ 为什么没有为匿名对象调用析构函数?

C++ 为什么没有为匿名对象调用析构函数?,c++,oop,c++11,copy-constructor,anonymous,C++,Oop,C++11,Copy Constructor,Anonymous,在工作中,我遇到了一段奇怪/令人困惑的代码,我觉得这段代码与匿名对象生命周期概念有关。下面是代码示例: #include<iostream> #include<string> class A { private: int i; std::string s; public: A(int ii, std::string ss = "Hello") { i = ii; s = ss; } void Display() { std::cout&l

在工作中,我遇到了一段奇怪/令人困惑的代码,我觉得这段代码与匿名对象生命周期概念有关。下面是代码示例:

#include<iostream>
#include<string>

class A {
private:
    int i;
    std::string s;
public:
    A(int ii, std::string ss = "Hello") { i = ii; s = ss; }
    void Display() { std::cout<<i<<"\n"; }
    ~A() { std::cout<<"A::~A()"<<"\n";}
};

void function()
{
    A a = 1;
    //A a = A(1);
    a.Display();
}

int main()
{
    function();
    return 0;
}
VS2010中的输出2(如果A=A(1))

 1
  A::~A()
A::~A()
1
A::~A()
输出2非常有意义,因为析构函数被调用两次(包括匿名)对象

然而,output1让我困惑,无法理解为什么析构函数被调用一次(而不是匿名)对象

上行将调用类
A
的复制构造函数(
A(const A&rhs)
),编译器应使用参数
1
为其创建匿名对象。如果是这种情况,析构函数应该被调用两次


有人能给我解释一下这种行为吗?。可能是我遗漏了一些明显的东西。

您的编译器正在删除
A A=1的副本,而不是
A=A(1),gcc能够在这两种情况下复制,这可以用
-fno elide构造函数测试

您的编译器正在为
A A=1
而不是
A=A(1)删除副本,gcc能够在这两种情况下复制,这可以用
-fno elide构造函数测试
A=A(1)相当于
A=1。但是,在这两种情况下都可能发生:
A(1)
实际上直接构造到
A
,而不是单独构造然后复制或移动

由编译器决定是否在任何允许的情况下(如上面的链接所述)执行复制省略相当于
A=1。但是,在这两种情况下都可能发生:
A(1)
实际上直接构造到
A
,而不是单独构造然后复制或移动


由编译器决定是否在任何允许的场景中执行复制省略(如上面的链接所述)。

fno-elide构造函数标志对于理解这一点非常有用。fno-elide-constructors标志对于理解这一点非常有用。
A a = 1;