草庐IT

c++ - 带有大括号初始化的 make_unique

https://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique写道std::make_unique可以实现为templatestd::unique_ptrmake_unique(Args&&...args){returnstd::unique_ptr(newT(std::forward(args)...));}这不适用于没有构造函数的普通结构。这些可以用大括号初始化,但没有非默认构造函数。示例:#includestructpoint{intx,z;};intmain(){std::make_unique(1,2);}Com

c++ - 避免在默认模板中使用尖括号

如果我有一个带有默认模板类型的模板类,我必须写模板尖括号。是否可以通过某种方式避免这种情况?例子:templateclasstt{public:Tget(){return5;}};...ttt;//howtoavoidstd::cout到目前为止,我是通过单独的命名空间并重新声明类来完成此操作的:namespacedetail_{templateclasstt{public:Tget(){return5;}};}classtt:publicdetail_::tt{}...ttt;std::cout问题是,如果我想将该类与其他类型一起使用,我必须检查命名空间detail_。还有其他解决方

c++ - 函数名和花括号之间成员变量赋值的名称和原因是什么?

看看这段代码:Size::Size(intiSetWidth,intiSetHeight):iWidth(iSetWidth),iHeight(iSetHeight){}据推测,这意味着同样的事情:Size::Size(intiSetWidth,intiSetHeight){iWidth=iSetWidth;iHeight=iSetHeight;}为什么要使用前者或后者?前者的名字是什么? 最佳答案 不,它们的意思并不完全相同。当一个构造函数被执行时,在进入代码块(花括号之间的代码)之前,它会构造所有对象数据成员。您在初始化程序(冒

c++ - 带大括号的 double 浮点初始化

为什么编译器(clang,gcc)在执行此操作时不警告缩小转换floata{3.1231231241234123512354123512341235123541235};floata={double(3.1231231241234123512354123512341235123541235)}我预计会收到警告,因为我使用大括号进行了显式值初始化。按照这个答案Link它应该吐出一个错误。Compilationhere 最佳答案 [dcl.init.list]/§7(标准草案)Anarrowingconversionisanimplic

c++ - 类(class)括号后的名字是什么意思?

我遇到过this代码示例,我记得我以前见过它,但我不知道它的用途和作用?我在互联网上搜索过,但没有找到。代码:classC{intx;//anon-staticvariable,implicitlyprivatepublic:C():x(0){}//defaultconstructor//astaticmemberfunction,whichusesanon-staticvariableperfectlywellstaticintIncr(C&instance){return++(instance.x);}}g_c;intmain(void){Cc2;returnC::Incr(g_c

c++ - 从成员构造函数中抛出异常(大括号初始值设定项与初始值设定项列表)

我对自己在初始化成员对象期间(从构造函数)抛出异常时发生的情况的理解失去了信心(可能有2个小时)。举个例子:intinit(intf){throwf;}structX{X(intf):n{init(f)}{}intn;};structP{Xx{20};};和用法:intmain(intargc,char**argv){try{Pp{};}catch(intn){std::cout此代码(C++11模式)编译良好(使用GCC7.2.1)并且在Linux(Centos7.4.1708)下我得到:terminatecalledafterthrowinganinstanceof'int'[1]

C++:使用大括号防止赋值时变窄

我很熟悉在初始化变量时使用花括号/初始化列表来防止变窄,但是在为赋值时使用它是个好习惯变数也?例如inti{1};//initializeito1doubled{2.0};//initializedto2.0i={2};//assignvalue2toii={d};//error:narrowingfromdoubletoint是否有理由不使用大括号进行赋值? 最佳答案 不是初始化和赋值的问题。这是一个不同类型的问题。如果您尝试用double初始化一个int变量,您会得到同样的错误。并且您可以将{d}分配给另一个double变量。i

c++ - 使用 clang-format - 将空括号保持在同一行

我正在尝试配置clang-format,这样大括号通常会在它们自己的行上开始:voidfunc(){if(...){printf("TaDa\n");}}但我希望它在大括号为空时保持在一行中。(主要用于ctors):Bar::Bar(intval):_val(val){}目前它看起来像这样:Bar::Bar(intval):_val(val){}有什么想法吗?(经过编辑以使情况更清楚) 最佳答案 更新:万岁!现在可以使用Clang5.0或更高版本的自定义BreakBeforeBraces。请参阅documentation中的Spli

c++ - 有效地从字符串中读取括号中的两个逗号分隔的 float ,而不受全局语言环境的影响

我是一个图书馆的开发人员,我们的旧代码使用sscanf()和sprintf()从字符串读取/写入各种内部类型。与使用我们的库且其语言环境与我们基于XML文件的语言环境(“C”语言环境)不同的用户遇到了问题。在我们的例子中,这导致从这些XML文件解析出的值不正确,并且在运行时以字符串形式提交了这些值。用户可以直接更改语言环境,但也可以在用户不知情的情况下更改语言环境。如果语言环境更改发生在另一个库(例如GTK)中,而该库是一个错误报告中的“肇事者”,则可能会发生这种情况。因此,我们显然希望从语言环境中删除任何依赖关系,以使自己永久摆脱这些问题。我已经阅读了关于float/double/i

c++ - 为什么我们不能在未评估的上下文中使用大括号初始化程序?

我最近看到一些基于SFINAE的代码,如下所示:templateautotest(T&myclass)->decltype(myclass.f(),void()){//dosomethinghere,don'treturnanything(void)}基本上,上面的函数使用SFINAE来拒绝所有没有f()作为成员函数的T类型的参数。SFINAE发生在decltype中,我们有2个用逗号运算符分隔的表达式。如果无法评估第一个表达式,SFINAE将启动并拒绝重载。如果可以计算表达式,则由于逗号运算符,函数返回void。据我所知,void()在未评估的上下文(是的,这是合法的)中“构造”一个