返回一个带有 "return std::set<int>()" 的空集 - 为什么它会运行?
Return an empty set with "return std::set<int>()" - why does it run?
不明白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
后面跟一个表达式,因此必须将其视为表达式而非类型。
这是对对象构造函数的调用。它将创建在堆栈上分配的指定类型的新对象。因此,这个精确的语句将分配新的空集,并将其作为函数结果返回。
- 空基优化子对象的地址
- initializer_list中字符串的内容为何为空
- 在fstream期间忽略空行
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 运行时错误:矢量下标超出范围:正在检查空集
- C++创建空 HDF5 文件而不是数据集的代码
- 空集"Out of bound iterator"
- C++17模板演绎指南不用于空参数集?
- 根据 [basic.def.odr]/2,'A::a[0]' 的潜在结果集为空.为什么它是空的?
- C++17 模板推导指南未用于空参数集(版本 2)?
- regex_search返回 true,但regex_match返回空匹配集
- 如何使用 SOCI 正确声明空行集
- 如何将 std::set 的元素添加到另一个非空集
- 当试图在C++eclipse工作区中导出一个团队集(5个项目)时,项目列表是空的
- 返回一个带有 "return std::set<int>()" 的空集 - 为什么它会运行?
- c++ mysql连接器检查结果集为空
- Mysql的结果集总是空的
- mysql结果集为空