草庐IT

static-initializer

全部标签

c++ - 每次我想在基本类型之间进行转换时,我真的应该使用 static_cast 吗?

这是什么原因longl=1;charc=static_cast(l);floatf=1.0f;inti=static_cast(f);比这更好longl=1;charc=(char)l;floatf=1.0f;inti=(int)f;当将一种原始数据类型转换为另一种时?我有很多在类似情况下使用第二种样式进行类型转换的遗留代码,所以这也是一个关于我是否应该对该代码进行全面修订的问题。 最佳答案 面向future。假设将来我这样做:floatblah=1.0f;float*f=&blah;现在,inti=static_cast(f);停

c++ - 为什么使用 static_cast<int>(x) 而不是 (int)x?

我听说static_cast函数应该比C风格或简单函数风格的转换更受欢迎。这是真的?为什么? 最佳答案 主要原因是经典的C转换不区分我们所说的static_cast()。,reinterpret_cast(),const_cast(),和dynamic_cast().这四件事完全不同。Astatic_cast()通常是安全的。语言中有一个有效的转换,或者一个适当的构造函数使它成为可能。唯一有点冒险的时候是当你向下转换到一个继承的类时;您必须通过语言外部的方式(如对象中的标志)确保该对象实际上是您声称的后代。dynamic_cast(

c++ - C++ 中 static 和 global 的替代品?

我有一个类实例需要被其他一些类访问。将实例始终沿构造链向下传递会非常麻烦。我尽量避免使用全局变量,因为人们往往反对这样做。我以为我将此实例声明为类的静态成员,然后包含此类以访问该实例,但这也不起作用错误:调用类“Foo”的私有(private)构造函数要在QGraphicsView框架的上下文中进一步说明问题:我想将由Controller类(管理项目)实例化的QGraphicsItems添加到QGraphicsScene,它是(但我不坚持这个细节)我的QMainWindow类的成员。我花了很多时间在互联网上搜索,但我是新手,有点被困在这里。对于解决困境的最佳方法是什么,我很感激。

C++ std::vector initializer_list 重载歧义 (g++/clang++)

考虑以下代码:#include#defineBROKENclassVar{public:#ifdefBROKENtemplateVar(Tx):value(x){}#elseVar(intx):value(x){}#endifintvalue;};classClass{public:Class(std::vectorarg):v{arg}{}std::vectorv;};无论BROKEN是否被定义,Clang++(7.0.1)编译它没有错误,但是如果BROKEN被定义,g++(8.2.1)会引发错误:main.cpp:9:20:error:cannotconvert‘std::vect

c++ - 可选地支持模板的 initializer_list 构造可能包装容器

如果我有一个包装标准容器的模板,似乎我可以相当轻松地委托(delegate)initializer_list构造函数:templatestructholder{Tt_;holder():t_(){}holder(std::initializer_listvalues):t_(values){}};例如,这与std::vector配合得很好。intmain(intargc,char*argv[]){holder>y{1,2,3};returnEXIT_SUCCESS;}但它很明显不适用于作为“int”的T或任何其他没有嵌套value_typetypedef的类型。因此,我想使用某种ena

c++ - 可以为 initializer_list 文字重载运算符吗?

这个问题在这里已经有了答案:InitializerlistsandRHSofoperators(1个回答)关闭5年前。我正在尝试为std::initializer_list重载运算符,但以下代码既不在GCC4.7.2也不在Clang3.2中编译:#includevoidoperator+(conststd::initializer_list&,conststd::initializer_list&);intmain(){{1,2}+{3,4};}13.5/6规定运算符函数应至少有一个参数,其类型为类、枚举或对其中之一的引用,标准将initializer_list指定为模板类,所以对我来

c++ - 在 clang 中返回 std::initializer_list

这个问题在这里已经有了答案:lifetimeofastd::initializer_listreturnvalue(2个答案)关闭7年前。考虑这个代码示例:#include#includeintmain(){for(autoe:[]()->std::initializer_list{return{1,2,3};}())std::cout我尝试用g++编译它(gcc版本4.9.2(Debian4.9.2-10))并且输出是正确的。在clang++(Debianclangversion3.5.0-9(tags/RELEASE_350/final)(basedonLLVM3.5.0))中输出

c++ - 使用 initializer_list 的模糊重载解析

我在VisualStudio上测试了以下代码,它编译并打印了“A(double)”。#include#includestructA{A(std::initializer_list){puts("initializer_list");}//(1)A(std::initializer_list){puts("initializer_list");}//(2)A(double){puts("A(double)");}//(3)};intmain(){Avar{1.1};}但是IntelliSense和http://ideone.com/ZS1Mcm不同意,说构造函数“A::A”的多个实例与参

c++ - 充分利用 static_assert 和 std::is_invocable

我有一个包含多个函数对象的库,这些函数对象可能只接受几种类型,具体取决于std::is_integral.我要std::is_invocable在条件失败时返回false,但当用户尝试调用函数对象的实例时,我还想要一个不错的static_assert错误消息。这是我目前拥有的函数对象的一个​​简化示例:structfunction{templateautooperator()(Iteratorfirst,Iteratorlast)const->std::enable_if_t::value_type>>{/*something*/}};通过这样的实现,std::is_invocable

c++ - 具有-static 和-rdynamic 的backtrace_symbols()

查看thisquestion和thisquestion我可以看到要使backtrace_symbols()正常工作,必须使用-rdynamic标志进行编译。我已经在测试程序中尝试过它并且它可以工作,但我正在编写一个程序,该程序也是使用-static和thispage编译的表示当-static传递给编译器/链接器时backtrace_symbols()不起作用。是否有任何快速解决方法,或者我的静态链接程序中永远不会有人类可读的回溯函数? 最佳答案 答案已经在手边:在thesamepageIlinkedinthequestion中.最后