为什么在评估完整表达式后调用临时对象的析构函数不是:
#include <iostream>
struct A
{
int a;
A();
~A();
};
A::~A()
{
std::cout << "~A()" << std::endl;
}
A::A()
{
std::cout << "A()" << std::endl;
}
int main()
{
A b = A(); //Constructing of temporary object and applies copy-initalization
std::cout << "side effect" << std::endl;
//Destructor calling.
}
输出:
A()
side effect
~A()
但是12.2 / 3 [class.temporary]说:
当实现引入类的临时对象时 有一个非平凡的构造函数(12.1,12.8),它应该确保a 为临时对象调用构造函数。同样, 析构函数应该被称为临时的非平凡的 析构函数(12.4)。 临时对象作为的最后一步被销毁 评估(词汇表)包含的全表达式(1.9) 他们被创造的地方。
答案 0 :(得分:2)
使用您的编译器和选项可以省略(优化掉)临时值,这是允许的。
因此没有临时性。
因此没有缺少构造函数和析构函数调用对。
同样值得注意的是,复制和移动构造函数是唯一允许编译器假设构造函数没有副作用的构造函数,即使它知道更好。
C ++11§12.8/ 31 :
“当满足某些条件时,允许实现省略类对象的复制/移动构造,即使对象的复制/移动构造函数和/或析构函数具有副作用。 [...]