草庐IT

initialization

全部标签

c++ - std::initializer_list 类型推导

最近写了一个很简单的类。classC{public:voidAddString(std::initializer_list>x){//irrelevant}};intmain(){Cc;c.AddString({{"1",1},{"2",2},{"3",3}});....//otherunimportantstuffreturn0;}令我惊喜的是,它编译并正常工作。有人可以向我解释一下编译器是如何推断出嵌套的大括号初始值设定项是用于std::pair的吗?我正在使用MSVS2013。 最佳答案 c.AddString({{"1",1

c++ - 逗号作为变量初始化中的分隔符(不是作为运算符)

这似乎是一个简单的问题,但我已经很久没有以自己的方式检查过这个问题了……当初始化用逗号分隔的变量时,我假设以下是不安全的做法:unsignedintn=foo.size,nxn=n*n;因为我从来没有真正使用逗号运算符来表示句法糖等;而是表明两个表达式是独立的——作为一种对“细粒度并行性”(或表达式独立性)的隐式注释,这通常会使代码更简洁,例如,if()a=true,b=value;而不是为分号分隔的表达式要求{}范围。但我的问题实际上是重新检查变量初始化的情况。我的假设是否不正确nxn不能依赖于按预期进行初始化?还是我一直都在误解中苦苦挣扎? 最佳答案

c++ - 为什么这里涉及移动构造函数

我有这段C++代码:classArgs{};classMyClass{public:MyClass(Args&a){}MyClass(MyClass&&)=delete;};intmain(){Argsa;MyClassc1=MyClass(a);MyClassc2=a;MyClassc3(a);return0;}这不会编译,因为对象c1和c2的构造似乎涉及类的移动构造函数:错误:使用已删除的函数“MyClass::MyClass(MyClass&&)”似乎编译器想要创建临时对象,然后将它们移动到c1和c2。为什么会这样?这三个语句不应该只调用MyClass(Args&a)构造函数吗?

c++ - 为什么这个 initializer_list 在传递字符串时使用了错误行为?

我已经尝试了我的G++版本的C++0x初始化列表实现,但它只输出空行。#include#include#includeintmain(){std::initializer_lista({"hello","stackoverflow"});for(autoit=a.begin(),ite=a.end();it!=ite;++it)std::cout我不知道我做错了什么。谁能帮帮我吗? 最佳答案 在上面的示例中,您似乎正在创建两个初始化列表。临时{"hello","stackoverflow"}和std::initializer_lis

c++ - 评估潜在常量表达式期间的未定义行为

考虑这个程序:#include#include#includeexterninti;structS{S(){if(i==0){puts("Hello,world!");exit(0);}}};Ss;inti=1+2*INT_MIN;intmain(){}根据我对表达式求值的理解,这是一个严格符合标准的程序,它打印“Hello,world!”,然后退出,并且从不实际求值i的初始化程序:3.6.2Initializationofnon-localvariables[basic.start.init][...]Variableswithstaticstorageduration(3.7.1)

c++ - 绑定(bind)引用实际上是否评估操作数?

考虑这段代码:int&x=*newint;赋值的RHS是否实际上取消引用新创建的指针,导致UB由于读取未初始化的变量?或者这是否可以合法地用于以后分配一个值,如x=5;? 最佳答案 据我所知,您所做的一切都不涉及未定义的行为。但是,它确实会立即产生内存泄漏的风险。它可以快速解析(因为&x会解析到泄漏内存的地址,因此可以被删除)但是如果你要离开范围,你将无法检索该指针。编辑:切中要点,如果你要写的话int&x=*newint;x=5;std::cout>x;std::cout代码的行为就像您只是将x声明为intx;一样,除了指针在程序

c++ - C++ 全局初始化可以有多惰性?

我习惯于认为全局变量/静态类成员的所有初始化都发生在main()的第一行之前。但我最近在某处读到该标准允许稍后进行初始化以“协助动态加载模块”。当动态链接时我可以看到这是真的:我不希望在我dlopen'ed库之前初始化库中的全局初始化。但是,在一组静态链接在一起的翻译单元(我的应用程序的直接.o文件)中,我会发现这种行为非常不直观。这只会在动态链接时延迟发生,还是可以随时发生?(或者我读错了什么?;) 最佳答案 该标准在3.6.2/3中有以下内容:Itisimplementation-definedwhetherornotthedy

c++ - 使用整数文字初始化 char 数组和 char 的区别

在我的系统上(4.13.11-1-ARCH,gcc7.2.0)char是signed。当使用integerliteral初始化char数组时,如下所示:constcharmydata[]={0x80};我收到以下错误:error:narrowingconversionof‘128’from‘int’to‘char’inside{}[-Wnarrowing]然而,当我改为执行constchardata=0x80时,编译器并不担心任何缩小,尽管它当然会发生。输出为7F,即最大正signedchar值。问题为什么编译器不会同样担心两种情况下的截断问题? 最佳答案

c++ - C++中普通类型的构造和初始化

Atrivialclass是平凡可复制的,并且有一个trivialdefaultconstructor(trivialtype要么是其中之一,要么是工作方式类似的内置类)。自youcanusememcpy复制普通类型的对象,并且由于default-initializing普通类型不会更改表示中的任何字节¹,以下代码(使用C++20概念)是否正确初始化传入对象的拷贝?#include#include#include#includetemplateT*copy_trivial(Torig)requiresstd::is_trivial_v{void*buf=std::aligned_all

c++ - 返回并自动推导 std::initializer_list

在以下内容中:autox={0};//autodeductionofstd::initializer_listautoy=[]()->std::initializer_list{return{0};}();//explicitautoz=[](){return{0};}();//won'tcompile为什么不能返回并自动推断std::initializer_list的类型? 最佳答案 好吧,因为标准是这么说的,而且因为braced-init-list不是表达式。根据C++11标准的第5.1.2/4段:[...]Ifalambda-