返回一个带有 "return std::set<int>()" 的空集 - 为什么它会运行?

Return an empty set with "return std::set<int>()" - why does it run?

本文关键字:gt 空集 为什么 运行 int set 一个 返回 std return lt      更新时间:2023-10-16

不明白return std::set<int>();为什么返回空的std::set<int>std::set类中的operator ()是否存在运算符重载?我假设std::set<int>()是一个函数,而不是一个对象!这个函数在哪里定义?

默认构造函数std::set<int> s;似乎与表达式std::set<int>()一样???

谢谢你的回复。。。我似乎不懂C++的基本知识。。。

std::set<int>()用作表达式时,是std::set<int>的临时默认构造实例。

首先,std::set<int>是一种类型。因此,C++11§5.2.3[expr.type.conv]/2解释了发生的情况:

表达式T(),其中T是非数组完整对象类型或(可能是cv限定的)void类型的简单类型说明符或typename说明符,创建指定类型的prvalue。其值是值初始化(8.5)T类型对象所产生的值;void()情况不进行初始化。

值初始化有很多规则,但对于std::set<int>这样的类来说,它相当于默认初始化,它只调用默认构造函数。由于std::set<int>的默认构造函数生成了一个空集,所以您会得到这样的结果。


值得注意的是,如果将参数放在括号中,这些参数将被传递给相应的构造函数。在这方面,这与创建临时对象的任何其他构造函数调用一样。

同样值得注意的是,std::set<int>()并不总是像我所描述的那样。请注意,我在用作表达式时说过。如果它出现在一个类型可能出现的地方,那么它也是一个有效的类型。特别是,它是一个没有参数的函数,返回一个std::set<int>。由于return后面跟一个表达式,因此必须将其视为表达式而非类型。

这是对对象构造函数的调用。它将创建在堆栈上分配的指定类型的新对象。因此,这个精确的语句将分配新的空集,并将其作为函数结果返回。