草庐IT

c++ - 标准在哪里谈论别名?

C++标准中的什么地方提到了别名?我查看了目录,没有看到“别名”一词。我试图查看一个定义规则(3.2),但搜索“别名”没有结果。我不知所措。我正在寻找内存别名 最佳答案 别名主要在§3.10[basic.lval]/10中讨论:Ifaprogramattemptstoaccessthestoredvalueofanobjectthroughaglvalueofotherthanoneofthefollowingtypesthebehaviorisundefined:52thedynamictypeoftheobject,acv-qu

c++ - 写很多类型别名是不好的做法吗?

我发现自己编写了很多类型别名(typedef)以使代码更易于更改,但同时有些事情告诉我要避免这样做,因为它会给将要与之合作的人造成很多困惑/在我的代码上。也许不是最好的例子,但看看here.我还要举一个最近的例子;这些是我在构建XML解析器时摆弄的一些类:namespaceXML{structAttribute{typedefstd::stringname_t;typedefstd::stringvalue_t;Attribute(constname_t&name,constvalue_t&value="");name_tname;value_tvalue;};}namespaceXM

c++ - 别名模板的部分特化

别名模板的部分特化是不允许的:例如,尝试发挥创意,会在clang中产生此错误:templateusingunwrapped_future_t=T;templateusingunwrapped_future_t>=typenamefuture::value_type;^~~~~~~~~~~>error:partialspecializationofaliastemplatesisnotpermitted为什么不允许这样做? 最佳答案 您可以在originalproposal中找到答案别名模板:2.2TheMainChoice:Spec

c++ - 为什么 std::unique_ptr 没有像 std::shared_ptr 那样的别名构造函数?

我刚刚发现std::shared_ptr的“别名构造函数”并发现自己在问“为什么std::unique_ptr没有相应的构造函数?也就是说,如果你想分配一个Foo这样你就可以传递它的Bar应该完全管理Foo生命周期的函数的成员,能够这样做不是很好吗?#includestructB{}structA{Bb;}voidf(std::unique_ptrb);std::unique_ptra=std::make_unique();std::unique_ptrb{std::move(a),&(a->b)};//anowinvalid.f(std::move(b));//fnowrespons

c++ - C89 或 C++03 是否定义了严格的别名规则?

我看过severalassertionsC89和C++03定义了严格的别名规则。但是,我无法在标准中找到该特定位。我的理解是C99中添加了严格的别名规则。 最佳答案 此文本出现在C89,§3.3表达式中:Anobjectshallhaveitsstoredvalueaccessedonlybyanlvaluethathasoneofthefollowingtypes:thedeclaredtypeoftheobject,aqualifiedversionofthedeclaredtypeoftheobject,atypethatis

别名的设置与使用

在Linux中,你可以使用alias命令来设置别名。别名允许你为常用的命令创建自定义的缩写或快捷方式。这些别名会存在于当前会话中,如果你希望使别名永久生效,可以将其添加到你的shell配置文件中(例如.bashrc、.bash_profile、.zshrc等)。1、查看已有别名通过执行以下命令来查看Linux系统中自带的别名命令。以下列表是Linux系统中自带的别名命令。通过alias命令查看$aliasaliascp='cp-i'aliasegrep='egrep--color=auto'aliasfgrep='fgrep--color=auto'aliasgrep='grep--color

c++ - gcc 4.6.1 错误的严格别名警告

我正在尝试使用-pedantic-errors-pedantic-Wall-O2在gcc上编译以下内容#includevoidreset_uint32(uint32_t*pi){char*c=(char*)(pi);uint16_t*j=(uint16_t*)(c);//warning?j[0]=0;j[1]=0;}voidfoo(){uint32_ti=1234;reset_uint32(&i);}intmain(){foo();}但我没有看到任何严格的别名警告。我也试过启用-fstrict-aliasing-Wstrict-aliasing但仍然没有警告。这是一个错误吗?

c++ - 从 *char 数组转换时有哪些严格的别名规则?

在将char数组转换为其他类型时,我对严格的别名规则感到困惑。我知道允许将任何对象转换为char数组,但我不确定反过来会发生什么。看看这个:#includeusingnamespacestd;struct{alignas(int)charbuf[sizeof(int)];//correct?}buf1;alignas(int)charbuf2[sizeof(int)];//incorrect?struct{floatf;//obviouslyincorrect}buf3;typenamestd::aligned_storage::typebuf4;//obviouslycorrecti

c++ - Placement-new 与 gcc 4.4.3 严格别名规则

我有一些代码,多年来我一直在成功使用这些代码来实现“变体类型对象”;也就是说,一个C++对象可以保存各种类型的值,但只使用(大约)尽可能多的内存作为最大的可能类型。该代码在本质上类似于标记union,只是它也支持非POD数据类型。它通过使用char缓冲区、放置新/删除和reinterpret_cast来实现这一魔力。我最近尝试在gcc4.4.3(使用-O3和-Wall)下编译这段代码,并收到很多这样的警告:warning:dereferencingtype-punnedpointerwillbreakstrict-aliasingrules根据我的阅读,这表明gcc的新优化器可能会生成

c++ - 防止两个对象内部发生别名

我有一个与此类似的函数签名voidMutliply(constMatrixMN&a,constMatrixMN&b,MatrixMN&out);矩阵类内部有一个float*data;表示mxn组件。我想告诉编译器a和b不会为输出矩阵设置别名,因此它不会执行大量加载存储。我该怎么做?我知道我可以传递指向函数签名的指针,并用__restrict(在MSVC中)标记指针,但我想保留通过引用传递对象的习惯用法,其中对象包含指向内存的指针。我也知道__restrict不适用于对象引用。 最佳答案 根据优化器的工作方式,顶部的assert(&i