草庐IT

行为树

全部标签

c++ - swap() 会导致未定义的行为吗?

我试图从[C++11:utility.swap]中了解std::swap的条件。模板定义为templatevoidswap(T&,T&)(加上一些noexcept细节)并具有“交换存储在两个位置的值”的效果。以下程序是否定义明确?#includeintmain(){intm,n;std::swap(m,n);}如果我自己编写交换代码(即inttmp=m;m=n;n=tmp;),它将具有未定义的行为,因为它会尝试左值到右值的转换一个未初始化的对象。但是标准的std::swap函数似乎没有附加任何条件,也不能从规范中得出存在任何左值到右值和因此UB的规范。标准是否要求std::swap对未

c++ - swap() 会导致未定义的行为吗?

我试图从[C++11:utility.swap]中了解std::swap的条件。模板定义为templatevoidswap(T&,T&)(加上一些noexcept细节)并具有“交换存储在两个位置的值”的效果。以下程序是否定义明确?#includeintmain(){intm,n;std::swap(m,n);}如果我自己编写交换代码(即inttmp=m;m=n;n=tmp;),它将具有未定义的行为,因为它会尝试左值到右值的转换一个未初始化的对象。但是标准的std::swap函数似乎没有附加任何条件,也不能从规范中得出存在任何左值到右值和因此UB的规范。标准是否要求std::swap对未

c++ - `weak_ptr::expired` 对象 dtor 中的行为

考虑以下代码:#include#includeusingnamespacestd;classT;std::weak_ptrwptr;classT{public:T(){}~T(){std::cout();wptr=ptr;std::cout在这段代码中,我试图找出weak_ptr是否在对象销毁阶段过期。似乎是这样。输出是:notexpiredindtorexpired我使用gcc-5.1和ideone.现在,我有另一个问题。我找不到任何说明这是标准行为的文档。是否保证以这种方式工作,总是? 最佳答案 Now,Ihaveanother

c++ - `weak_ptr::expired` 对象 dtor 中的行为

考虑以下代码:#include#includeusingnamespacestd;classT;std::weak_ptrwptr;classT{public:T(){}~T(){std::cout();wptr=ptr;std::cout在这段代码中,我试图找出weak_ptr是否在对象销毁阶段过期。似乎是这样。输出是:notexpiredindtorexpired我使用gcc-5.1和ideone.现在,我有另一个问题。我找不到任何说明这是标准行为的文档。是否保证以这种方式工作,总是? 最佳答案 Now,Ihaveanother

c++ - 保证复制省略的行为是否取决于用户定义的复制构造函数的存在?

以下代码在使用或不使用用户定义的复制构造函数时表现不同underGCC8.0.1:#includestructS{inti;int*p;S():i(0),p(&i){}//S(constS&s):i(s.i),p(&i){}//#1//S(constS&s):i(s.i),p(s.p){}//#2//S(constS&s)=delete;//#3};Smake_S(){returnS{};}intmain(){Ss=make_S();assert(s.p==&s.i);}使用注释过的用户定义的复制构造函数中的任何一个(即使使用#2,执行简单浅拷贝的构造函数),断言都不会失败,这意味着g

c++ - 保证复制省略的行为是否取决于用户定义的复制构造函数的存在?

以下代码在使用或不使用用户定义的复制构造函数时表现不同underGCC8.0.1:#includestructS{inti;int*p;S():i(0),p(&i){}//S(constS&s):i(s.i),p(&i){}//#1//S(constS&s):i(s.i),p(s.p){}//#2//S(constS&s)=delete;//#3};Smake_S(){returnS{};}intmain(){Ss=make_S();assert(s.p==&s.i);}使用注释过的用户定义的复制构造函数中的任何一个(即使使用#2,执行简单浅拷贝的构造函数),断言都不会失败,这意味着g

c++ - 由于未定义的行为或编译器错误导致 C++ 代码崩溃?

我遇到了奇怪的崩溃。我想知道这是否是我的代码或编译器中的错误。当我使用MicrosoftVisualStudio2010编译以下C++代码作为优化版本构建时,它在标记的行中崩溃:structtup{intx;inty;};classC{public:structtup*p;structtup*operator--(){return--p;}structtup*operator++(int){returnp++;}virtualvoidReset(){p=0;}};intmain(){Cc;volatileintx=0;structtupv1;structtupv2={0,x};c.p=

c++ - 由于未定义的行为或编译器错误导致 C++ 代码崩溃?

我遇到了奇怪的崩溃。我想知道这是否是我的代码或编译器中的错误。当我使用MicrosoftVisualStudio2010编译以下C++代码作为优化版本构建时,它在标记的行中崩溃:structtup{intx;inty;};classC{public:structtup*p;structtup*operator--(){return--p;}structtup*operator++(int){returnp++;}virtualvoidReset(){p=0;}};intmain(){Cc;volatileintx=0;structtupv1;structtupv2={0,x};c.p=

c++ - 使用 union 在具有共同初始序列的两个结构之间进行转换是否合法且定义明确的行为(参见示例)?

我有一个带有公开面向结构A和内部结构B的API,并且需要能够将结构B转换为结构A。以下代码是否合法和明确定义的行为C99(和VS2010/C89)和C++03/C++11?如果是,请解释是什么使它定义明确。如果不是,那么在两个结构之间进行转换的最有效和跨平台的方法是什么?structA{uint32_tx;uint32_ty;uint32_tz;};structB{uint32_tx;uint32_ty;uint32_tz;uint64_tc;};unionU{structAa;structBb;};intmain(intargc,char*argv[]){Uu;u.b.x=1;u.b

c++ - 使用 union 在具有共同初始序列的两个结构之间进行转换是否合法且定义明确的行为(参见示例)?

我有一个带有公开面向结构A和内部结构B的API,并且需要能够将结构B转换为结构A。以下代码是否合法和明确定义的行为C99(和VS2010/C89)和C++03/C++11?如果是,请解释是什么使它定义明确。如果不是,那么在两个结构之间进行转换的最有效和跨平台的方法是什么?structA{uint32_tx;uint32_ty;uint32_tz;};structB{uint32_tx;uint32_ty;uint32_tz;uint64_tc;};unionU{structAa;structBb;};intmain(intargc,char*argv[]){Uu;u.b.x=1;u.b