草庐IT

c++ - auto 带括号和初始化列表

来自anotherquestion:C++17起,autox0{1,2,3,4};,之前推导出一个初始化列表,现在不再被允许(当然,我们可以使用autox0={1,2,3,4};代替......)。现在一如既往地避免统一初始化(例如std::vectorv({1,2,3,4});,即以初始化列表作为参数的explicit构造函数调用)并类似于定义明确的autox(7);(我自己也不会使用的构造......),我想出了以下内容:autox({1,2,3,4});//->std::initializer_listx({1,2,3,4});这使用GCC7.2.0(mingw64)编译,但发出

c++ - 用 XOR 在括号前移出

如果我有z*a+z*b+z*c+...+z*y之类的产品总和,则可以移动z因子,相同,在括号前:z(a+b+c+...y).我想知道如果bitwiseXOR怎么可能(如果是的话)做同样的伎俩用于代替乘法。z^a+z^b+...z^y->z^(a+b+...+y)也许a,b,c...应该在添加之前进行预处理,例如逻辑否定或其他什么?z可能会发生变化,因此如果需要,预处理不应依赖于特定的z值。 最佳答案 来自Wikipedia:Distributivity:withnobinaryfunction,notevenwithitself所以

c++ - 用大括号初始化标量

在C和C++中,可以使用大括号初始化数组和结构:inta[]={2,3,5,7};entrye={"answer",42};但是,在atalkfrom2007,Bjarne提到这种语法也适用于标量。我试过了:inti={7};它确实有效!允许使用大括号初始化标量的基本原理是什么?注意:我具体不是在谈论C++11统一初始化。这是很好的旧C89和C++98。 最佳答案 Whatistherationalebehindallowingtheinitializationofscalarswithbraces?int是POD。因此,在int(

c++ - 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?

当使用包含多个braced-init-list的braced-init-list时,标准对B、C和D定义的规则是什么?对于B,我相信这个场景在标准中被定义为带有单个元素的花括号初始化列表,因此它调用Test(int)直接没有临时-但我无法找到在哪里。对于C和D,我不确定这是否是未定义的行为。我还对使用多个元素(即{{{1,2}}})时发生的情况感兴趣。如果这会改变B、C或D的行为?#includestructTest{Test(constinta){//AandBcallthis}Test(Test&&test)=delete;Test(constTest&test)=delete;}

c++ - 当 parent 初始化时,为什么构造函数初始化列表中的 C++11 花括号初始化不起作用?

在初始化对抽象类型的引用时,构造函数初始化列表中的{}初始化与()初始化有何不同?拿下面的类吧:classAbstractBase{public:AbstractBase(){}virtual~AbstractBase()=default;virtualvoidab()=0;};classFoo:publicAbstractBase{public:Foo(){}voidab(){}};classBar{public:Bar(constAbstractBase&base):myBase{base}{}private:constAbstractBase&myBase;};intmain()

c++ - 为什么 catch 异常声明允许使用尾括号?

我遇到了一些如下所示的C++代码:classexception{};intmain(){try{throwexception();}catch(exception()){//...}}注意catch(exception())中的额外括号。根据CompilerExplorer,这被编译成相同的目标代码,就好像它是用catch(exception&)编写的一样。在什么基础上允许额外的括号集?标准的哪一部分允许这样做?据我所知,catch子句需要类型说明符,但exception()似乎不像类型说明符。 最佳答案 异常处理程序声明像函数声明

c++ - 我可以使用 std::initializer_list 而不是大括号括起来的初始化程序来初始化数组吗?

我可以使用std::initializer_list对象而不是大括号括起来的初始化程序来初始化数组吗?众所周知,我们可以这样做:http://en.cppreference.com/w/cpp/language/aggregate_initializationunsignedcharb[5]{"abc"};//equivalenttounsignedcharb[5]={'a','b','c','\0','\0'};intar[]={1,2,3};std::arraystd_ar2{{1,2,3}};//std::arrayisanaggregatestd::arraystd_ar1={

java - 返回值周围的括号 - 为什么?

我经常看到这样的代码(C、C++,有时还有Java):return(value);我看不出这些括号有什么好处。所以我的问题是,程序员是否假设return是某种以返回值作为参数的函数,还是真的存在这些括号有意义的情况?我知道有人问过类似的问题here,但这仅与ANSIC有关。我想知道是否有C++或Java特有的方面尚未得到解答。 最佳答案 关于C括号放在有表达式的地方,并且希望返回值是表达式的值。即使这样也不需要括号。完全可以这样写returnx+y;程序员确实将其return(x+y);使其更具可读性。所以,加括号是一个见仁见智的问

C++ 使用方括号和指向实例的指针

我创建了一个单例类,它使用GetInstance()方法来获取实例地址(指针)。在类内部,我有一个unsignedlongint数组,我为它创建了operator[](直接访问数组)。如何使用从GetInstance获得的指针来使用[]运算符?我试过了:classrisc{//singletonprotected:unsignedlongregisters[8];staticrisc*_instance;risc(){for(inti=0;i但它不起作用......有没有办法可以使用括号直接使用类指针访问数组?谢谢! 最佳答案 试试

c++ - 稍后添加 initializer_list 构造函数时,使用大括号初始化语法会改变构造行为吗?

假设我有这样的类(class):classFoo{public:Foo(intsomething){}};我使用以下语法创建它:Foof{10};然后我添加一个新的构造函数:classFoo{public:Foo(intsomething){}Foo(std::initializer_list){}};f的构造会发生什么?我的理解是它将不再调用第一个构造函数,而是现在调用初始化列表构造函数。如果是这样,这似乎很糟糕。为什么这么多人推荐使用{}语法而不是()进行对象构造,而稍后添加initializer_list构造函数可能会默默地破坏事情?我可以想象这样一种情况,我正在使用{}语法构造