请考虑这个简化的C++14程序:
#include <iostream>
struct A
{
A() { std::cout << "A() "; }
~A() { std::cout << "~A() "; }
};
int main()
{
auto l = std::initializer_list<A>{A()};
std::cout << ". ";
}
A() . ~A()
A() ~A() .
两个编译器在这里的行为都是正确的还是其中一个是错误的?
很微妙。
std::initializer_list
由基础数组(由编译器生成)支持。这个数组类似于一个临时对象,std::initializer_list
是绑定到它的一种引用类型。因此,只要“引用”存在,它就会延长临时数组的生存期。
在C++14中,我们没有保证删除副本。因此,应该发生的情况是std::initializer_list{A()}
生成了一个临时的initializer_list
,将另一个临时数组绑定到它,并将临时的initializer_list
复制到l
。
std::initializer_list<A> l {A()};
同时,在C++17编译时,您的原始代码在GCC和Clang上的行为是相同的。
在我的程序中,我基本上把所有对象都放在一个缓冲区中,现在当我想要绘制多个对象时遇到了问题,如果我只绘制一个,它仍然可以工作。 当我把所有调用修改为调用,当然还有所有底层基础结构时,问题就开始出现了。 到现在为止,我只是做了一个从顶点到索引的一对一映射。 我使用的是Java 8,LWJGL和OpenGL 3.3。 初始化: 所以我做了以下操作: 创建并将所有顶点数据存储在其中。 创建顶点数组对象,并
问题内容: 我刚刚将Golang从升级到。并且由于错误而无法编译: 在线 我想某些导入规则已更改。但是无法弄清楚如何更改导入代码以使其编译。 问题答案: 只需删除旧的pkg文件,通常它会自动升级。
GCC的实现销毁从返回完整表达式末尾的函数返回的数组。这是正确的吗? 该程序中的两个测试用例都显示了在可以使用该值之前执行的析构函数: 我认为这个计划应该奏效。但基本标准有点复杂。 return语句初始化返回值对象,就像它被声明一样 这将初始化给定系列初始化器中的一个临时初始化器列表及其底层数组存储,然后从第一个初始化器列表初始化另一个初始化器列表。阵列的生存期是多少?“数组的生存期与初始化器列表
C 没有GC机制,当C对象被导出到JavaScript环境后,必须使用某种方法进行对象生命周期管理,以彻底杜绝野指针、内存泄漏,引用计数无疑是最常用的方法。 4.4.1 引用计数基类 对象生命周期管理需要解决的问题是:当一个对象可能在多个地方被引用时,如何决定何时将其销毁。引用计数法解决这一问题的途径非常简单: 每个对象自带一个初值为0的引用计数; 对象的每个使用者,在获得一个对象的引用时,将其引
问题内容: 如果我点击了呼叫的页面。我需要等待多长时间,以便刷新页面时获得新的会话ID? 问题答案: 检出php.ini,为session.gc_maxlifetime设置的值是ID生存时间(以秒为单位)。 我相信默认值为1440秒(24分钟) http://www.php.net/manual/zh/session.configuration.php 编辑: 正如一些评论所指出的,上述内容并不完
关于这个主题已经有很多线程,但是我看不出讨论的问题是否适用于我的特定问题。 我有一个存储和函数的结构。简而言之,问题是这样的: 我想做的是存储一个与名称相关联的回调函数(将来可能会有更多内容)。 但当我尝试这样使用这段代码时: 我得到以下错误消息: 我试着像这样内联闭包 但是我又犯了一个错误 我相信我明白为什么我会这样。 在切换到一个函数引用以存储在我的命令结构中之前,我尝试使用一个通用类型参数,