草庐IT

Initialization

全部标签

c++ - 保证复制省略和 Nonmoveable{Nonmoveable{}}

我发现GCC7已经实现了有保证的复制省略,我在wandbox中尝试了下面的代码:#includestructNonMovable{NonMovable()noexcept=default;NonMovable(NonMovable&&)noexcept=delete;NonMovable&operator=(NonMovable&&)noexcept=delete;};NonMovableMake(){return{};}intmain(){//[[maybe_unused]]constautox=Make();//constautoz=NonMovable{};[[maybe_unu

c++ - g++ 4.8.2 在列表方法参数默认初始化时出错

我在尝试c++11的新特性时发现了一个问题。这是我的代码:#include#include#includeusingnamespacestd;classA{public:intf(lista,listb={}){coutl{"hello","world"};a.f(l);return0;}执行停留在“Thisline!!!”线。我继续调试,看起来问题就在这里。/**Returnsthenumberofelementsinthe%list.*/size_typesize()const_GLIBCXX_NOEXCEPT{returnstd::distance(begin(),end());

c++ - 统一和值(value)初始化

这个问题在这里已经有了答案:g++4.9rejectsvalidaggregateinitializationinC++14(1个回答)关闭7年前。我尝试对构造函数使用值初始化的成员使用值初始化(我不知道我是否真的使用了好的术语......)所以...当我定义:structA{inta_;};我可以使用:Aa{5};assert(m.a_==5);但是,如果我想使用成员大括号初始化器和初始化列表构造器structB{intb_{1};};这无法编译(c++14:http://ideone.com/MQ1FMU):Bb{2};这里是错误:prog.cpp:19:7:error:nomat

c++ - 错误 : jump to label 'foo' crosses initialization of 'bar'

以下C++示例无法使用gcc或clang进行编译,但仅使用ICC生成警告,而使用MSVC则完全不生成任何警告:intmain(intargc,char*argv[]){if(argcg++:init.cpp:13:error:jumptolabel‘clean_up’init.cpp:4:error:fromhereinit.cpp:7:error:crossesinitializationof‘inti’clang++:init.cpp:4:9:error:cannotjumpfromthisgotostatementtoitslabelgotoclean_up;^init.cpp:

c++ - C c;之间有什么区别吗?和 C c = C();?

#includeusingnamespacestd;classC{private:intvalue;public:C(){value=0;cout输出:默认构造函数默认构造函数问题:对于Cc1;显然会调用默认构造函数,对于Cc2=C();我以为会调用默认构造函数来初始化一个临时对象,然后复制构造函数将调用初始化c2,看来我错了。为什么? 最佳答案 这是一个复制省略的例子——基本上允许编译器优化掉复制。此处描述:http://en.cppreference.com/w/cpp/language/copy_elision

c++ - 这些在 C++ 中初始化 C 数组的方法有区别吗?

我想将数组的所有成员初始化为零,或者nullptrstructWindow{inta;};intmain(){Window*list[4]={0,0,0,0};Window*list2[4]={0};Window*list3[4]={};Window*list4[4]{0,0,0,0};Window*list5[4]{0};Window*list6[4]{};}我知道当至少一个成员初始化为任何值时,所有其他成员都初始化为零,所以如果我这样做:intlist[4]={6};第一个成员变为6,其余所有成员都被零初始化。但是我很困惑:intlist[4]{0};和intlist[4]{};我

c++ - 在模板中初始化静态成员

这是一个最小的例子:#includestructB{B(){x=42;}staticintx;};intB::x;templatestructA{intfoo(){returnb.x;}staticBb;};templateBA::b;//templatestructA;//explicitinstantiationwithN=2(!)intmain(intargc,char**argv){std::cout().foo()此程序使用g++4.9.2写入42,但使用VisualStudio2015RC写入0。另外,如果我取消显式实例化的注释,VS2015RC也会给出42,这很有趣,因为

c++ - 了解对象初始化

我在初始化数组时不小心忘了写大括号:structA{A(){std::coutDEMO输出:A(2)A(2)A(2)A(3)据我所知,这是正确的。N4257::12.6.1/2:Bracescanbeelidedintheinitializer-listforanyaggregate,eveniftheaggregatehasmembersofaclasstypewithuser-definedtypeconversions但是支撑初始化有不同的副作用:structA{A(){std::coutDEMO输出:A(2)A(3)A()您不能解释一下这种差异吗?

c++ - 零初始化、静态初始化和值初始化有何不同?

BenVoigt已指出here那:Zeroinitializationisoneofthestepsofstaticinitialization.Butyou'rerightthatyoucan'tblindlysubstitutethelatter(tag),sincezeroinitializationisalsoperformedforvalueinitialization.However,there'snoneedfor(atagnamed)zero-initializationinthecontextofC++,becausetagsalreadyexistforbothst

c++ - 聚合初始化不支持构造函数访问

这个问题在这里已经有了答案:Whenisaprivateconstructornotaprivateconstructor?(3个答案)关闭5年前。给出下面的示例,我惊讶地发现尽管默认构造函数被显式删除(或为此设置为默认构造函数),聚合初始化仍然是可能的。#includestructDefaultPrivate{constintn_;staticconstDefaultPrivate&create();private:DefaultPrivate()=delete;};constDefaultPrivate&DefaultPrivate::create(){staticDefaultP