不明白为什么return std::set<int>();
会给出一个空的std::set<int>
。
operator ()
类中的std::set
是否存在运算符重载?我假设std::set<int>()
是一个函数,而不是一个对象!这个函数定义在哪里?
似乎默认构造函数std::set<int> s;
与表达式std::set<int>()
相同???
感谢您的回复...似乎我不理解C ++的基础......
答案 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)
这是对象构造函数的调用。它将创建在堆栈上分配的指定类型的新对象。所以这个确切的语句将分配新的空集并将其作为函数结果返回。