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

时间:2014-09-15 20:34:33

标签: c++ operator-overloading default-constructor

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

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

感谢您的回复...似乎我不理解C ++的基础......

2 个答案:

答案 0 :(得分:7)

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

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

  

表达式 T(),其中T是非数组完整对象类型或(可能是cv限定的)void类型的simple-type-specifier或typename-specifier,它创建一个指定类型的 prvalue ,其值为 value-initializing (8.5)T类型的对象生成的值;没有为void()情况进行初始化。

值初始化有许多规则,但对于像std::set<int>这样的类,它等同于默认初始化,它只调用默认构造函数。由于std::set<int>的默认构造函数生成一个空集,这就是你得到的。


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

另外值得注意的是std::set<int>()并不总是按照我的描述进行。请注意,我在用作表达式时说过。如果出现类型可能出现的位置,则它也是有效类型。特别是,它是一个没有参数的函数,返回std::set<int>。由于return后跟一个表达式,因此必须将其视为表达式而不是类型。

答案 1 :(得分:1)

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