草庐IT

c++ - C++ 标准的哪一部分允许在括号中声明变量?

考虑以下代码:intmain(){int(s);}我很惊讶它会创建有效的变量s。谁能解释这里发生了什么? 最佳答案 [dcl.meaning]在标准中说:InadeclarationTDwhereDhastheform(D1)thetypeofthecontaineddeclarator-idisthesameasthatofthecontaineddeclarator-idinthedeclarationTD1.Parenthesesdonotalterthetypeoftheembeddeddeclarator-id,butth

c++ - 我们什么时候应该使用带括号和不带括号的 sizeof

这个问题在这里已经有了答案:Whatdoessizeofwithout()do?[duplicate](5个回答)关闭7年前。typedefstructrem{intaddr;charaddrbuf[32];}foo;这两个代码都返回相同的结果fooaddr;printf("sizeis:%d\n",sizeofaddr);printf("sizeis:%d\n",sizeof(foo));大小为:36大小为:36但是我们什么时候应该使用带括号和不带括号的sizeof? 最佳答案 当将sizeof与type一起使用时,您需要在类型周

c++ - 我们什么时候应该使用带括号和不带括号的 sizeof

这个问题在这里已经有了答案:Whatdoessizeofwithout()do?[duplicate](5个回答)关闭7年前。typedefstructrem{intaddr;charaddrbuf[32];}foo;这两个代码都返回相同的结果fooaddr;printf("sizeis:%d\n",sizeofaddr);printf("sizeis:%d\n",sizeof(foo));大小为:36大小为:36但是我们什么时候应该使用带括号和不带括号的sizeof? 最佳答案 当将sizeof与type一起使用时,您需要在类型周

c++ - 大括号初始值设定项列表中是否允许显式转换运算符?

以下代码可以使用GCC4.9.2编译,但不能使用Clang3.5.0:#includeclassFoo{public:explicitoperatorstd::string()const;};std::stringbar{Foo{}};//Worksing++,failsinclang++std::stringbaz(Foo{});//Worksinbothclang++说:foo.cpp:9:13:error:nomatchingconstructorforinitializationof'std::string'(aka'basic_string')std::stringbar{F

c++ - 大括号初始值设定项列表中是否允许显式转换运算符?

以下代码可以使用GCC4.9.2编译,但不能使用Clang3.5.0:#includeclassFoo{public:explicitoperatorstd::string()const;};std::stringbar{Foo{}};//Worksing++,failsinclang++std::stringbaz(Foo{});//Worksinbothclang++说:foo.cpp:9:13:error:nomatchingconstructorforinitializationof'std::string'(aka'basic_string')std::stringbar{F

c++ - 带空尖括号 <> 的模板函数调用

我对下面的模板行为感到困惑,因为在语法上,模板被保留以标记显式模板特化,因此它可以使用空尖括号(不带参数的模板)很好地编译。templatevoidadd(Ta,Tb){}intmain(){add(10,3);//compilesfinesincebothparametersareofsamedatatypeadd(10,3.2);//Error:nomatchingfunctionforcalltoadd(int,double)}在上述情况下,模板参数真的是可选的吗? 最佳答案 templateisreservedtomarka

c++ - 带空尖括号 <> 的模板函数调用

我对下面的模板行为感到困惑,因为在语法上,模板被保留以标记显式模板特化,因此它可以使用空尖括号(不带参数的模板)很好地编译。templatevoidadd(Ta,Tb){}intmain(){add(10,3);//compilesfinesincebothparametersareofsamedatatypeadd(10,3.2);//Error:nomatchingfunctionforcalltoadd(int,double)}在上述情况下,模板参数真的是可选的吗? 最佳答案 templateisreservedtomarka

c++ - 大括号初始化列表中的对象创建顺序

#includestructA{A(){std::coutC(Args&&...){}};intmain(intagrc,char*argv[]){C{A(),B()};//我有2个问题:为什么在第一个大括号初始化列表中对象是按从右到左的顺序创建的?为什么第二种情况下的括号会恢复此顺序?编辑:我已经用msvs2013编译了它 最佳答案 在第二种情况下,您实际上只是使用B();进行初始化;通过逗号操作符的使用,A()首先被构造和丢弃。C{(A(),B())};//|^^^^^^^^^^|//\-------->(A(),B())//^

c++ - 大括号初始化列表中的对象创建顺序

#includestructA{A(){std::coutC(Args&&...){}};intmain(intagrc,char*argv[]){C{A(),B()};//我有2个问题:为什么在第一个大括号初始化列表中对象是按从右到左的顺序创建的?为什么第二种情况下的括号会恢复此顺序?编辑:我已经用msvs2013编译了它 最佳答案 在第二种情况下,您实际上只是使用B();进行初始化;通过逗号操作符的使用,A()首先被构造和丢弃。C{(A(),B())};//|^^^^^^^^^^|//\-------->(A(),B())//^

c++ 带方括号的函数调用

intfunc(intn){returnn;}intmain(){cout这些实际上是什么意思?我想这是关于访问func+4并且在调用func[4]时为func分配了空间。但是,func[4,3,5]太荒谬了。 最佳答案 此代码编译且func[4]不是语法错误的原因是:1.函数类型可以隐式转换为相同类型的指针。所以,如果我们有这样的代码:intf(int);usingfunc_t=int(*)(int);voidg(func_t);我们可以写g(f)并且不会被迫编写g(&f)。&,将我们从类型int(int)带到int(*)(int