文章Are destructors overloadable?讨论了重载析构函数。这就提出了一个问题:析构函数可以有参数吗?我从来没有使用过或见过带参数的析构函数。我无法想出一个使用析构函数参数的理由的例子。
0s7z1bwu1#
C++0x draft n3290的§12.4节对析构函数有这样的描述:
析构函数
一个特殊的声明器语法使用一个可选的函数规范(7.1.2),后跟~,后跟析构函数的类名,后跟一个空参数列表,用于在类定义中声明析构函数。
所以,析构函数不接受参数。(2003年的标准与上述段落的措辞完全相同。)
velaa5lx2#
答案很简单,不可能。这将使自动资源管理成为一个非常棘手的问题,因为您必须担心析构函数接受哪些参数以及从哪里获取这些参数。那么在异常的情况下,编译器如何知道传递给你的析构函数的是什么呢?
2nc8po8w3#
不。你几乎从来不直接打电话给他们,所以有什么用呢。析构函数应该销毁对象,仅此而已。
bxjv4tth4#
我认为带参数的析构函数有时候是有用的。想想PMR。当我们使用pmr容器时,例如std::pmr::vector<std::pmr::string>。在每个std::pmr::string中,它将存储一个指向pmr分配器的指针,然而,指针存储在std::pmr::vector中,我们不必将其存储在每个std::pmr::string中。如果我们可以将指针传递给std::pmr::string的析构函数,我们就不必存储它。目前,我们还没有任何方法可以将参数传递给析构函数。顺便说一句,我们可以使用偏移量来获取参数(这种方法很难看,不能在实践中使用,如果有更好的方法,请让我知道)。这是一个example。
std::pmr::vector<std::pmr::string>
std::pmr::string
std::pmr::vector
4条答案
按热度按时间0s7z1bwu1#
C++0x draft n3290的§12.4节对析构函数有这样的描述:
析构函数
一个特殊的声明器语法使用一个可选的函数规范(7.1.2),后跟~,后跟析构函数的类名,后跟一个空参数列表,用于在类定义中声明析构函数。
所以,析构函数不接受参数。(2003年的标准与上述段落的措辞完全相同。)
velaa5lx2#
答案很简单,不可能。这将使自动资源管理成为一个非常棘手的问题,因为您必须担心析构函数接受哪些参数以及从哪里获取这些参数。那么在异常的情况下,编译器如何知道传递给你的析构函数的是什么呢?
2nc8po8w3#
不。你几乎从来不直接打电话给他们,所以有什么用呢。
析构函数应该销毁对象,仅此而已。
bxjv4tth4#
我认为带参数的析构函数有时候是有用的。想想PMR。当我们使用pmr容器时,例如
std::pmr::vector<std::pmr::string>
。在每个std::pmr::string
中,它将存储一个指向pmr分配器的指针,然而,指针存储在std::pmr::vector
中,我们不必将其存储在每个std::pmr::string
中。如果我们可以将指针传递给std::pmr::string
的析构函数,我们就不必存储它。目前,我们还没有任何方法可以将参数传递给析构函数。顺便说一句,我们可以使用偏移量来获取参数(这种方法很难看,不能在实践中使用,如果有更好的方法,请让我知道)。这是一个example。