草庐IT

c++ - 引用未初始化的内存而不访问它是否合法?

以下情况,我有一个包含指向整数变量的指针的结构,如下所示:structStructure[]={{&Var[0],&Var[1]},{&Var[2],&Var[3]}};事情是:Var在第一次填充此结构时未初始化。(如:NULL)不久之后(第一次传递)变量Var将被初始化,并且引用将相应更新。我认为这没有任何故障的原因,但我希望您能在这方面提供专业知识。将无效内存(带有数组下标)的引用放入这样的数组中是否合法?还是我需要针对这种情况采取不同的方法?在第一次初始化之前,我不会访问这些变量的内容。非常感谢。编辑:为了以后读者的利益:Var是一个全局指针变量,它在开始时被初始化为NULL。初

c++ - 在基本 ctor-initialiser 中将其强制转换为 `Derived*` 是否合法?

给出以下CRTP示例:templateintfoo(T*const){return0;}templatestructBase{Base():bar(foo(static_cast(this)){};intbar;};structDerived1:Base{};是this的转换至Derived*这里有效吗?我似乎记得可能不是,但现在找不到具体的证据。this的“自然”类型在这个阶段是Base*const,并且在某些情况下,甚至可以静态转换this初始化期间的指针不正常,例如在基础构造完成之前向上转换(12.7/3)。@DeadMG说:there'sanexplicitexceptioni

c++ - 检查子对象的地址是否在包含对象的范围内是否合法

2个问题:以下代码是否具有良好的已定义行为?是否有任何可能的c++实现可以断言?代码(c++11及更高版本):#include#include#includetemplateautoto_address(T*p){returnreinterpret_cast(p);}///Testwhetherpartisasub-objectofobjecttemplateboolis_within_object(Object&object,Part&part){autofirst=to_address(std::addressof(object)),last=first+sizeof(Object

c++ - 在从放置 new 获得的指针上使用 operator delete 的合法性

我很确定这段代码应该是非法的,因为它显然不起作用,但它似乎是C++0xFCD允许的。classX{/*...*/};void*raw=malloc(sizeof(X));X*p=new(raw)X();//accordingtothestandard,theRHSisaplacement-newexpression::operatordelete(p);//definitelywrong,perlitb'sanswerdeletep;//legal?Ihopenot也许你们中的一位语言律师可以解释标准是如何禁止这样做的。还有数组形式:classX{/*...*/};void*raw=m

c++ - 使用来自外部类的可变参数模板的 args 部分专门化可变参数模板内部类是否合法

考虑代码:#includetemplatestructouter{templatestructinner{staticconstexprboolvalue=false;};templatestructinner{staticconstexprboolvalue=true;};};intmain(){std::cout::inner::value该代码使用clang++编译,但使用g++编译时会产生错误:temp3.cc:11:11:error:parameterpackargument‘Ts...’mustbeattheendofthetemplateargumentliststruc

c++ - 在同一个地址多次放置新的位置是否明确/合法?

(注意:这个问题的动机是试图提出预处理器黑客来生成无操作分配来回答另一个问题:Macrothatacceptnewobject...请记住这一点!)这是一个人为的类:classfoo{private:intbar;public:foo(intbar):bar(bar){std::cout...我将这样分配://Note:foralignment,don'tusechar*bufferwithnewchar[sizeof(foo)]!void*buffer=operatornew(sizeof(foo));foo*p1=new(buffer)foo(1);foo*p2=new(buffe

c++ - "Narrowing conversion from ' int ' to ' char ' inside { }"交叉编译时的合法值

我有一个C++项目,我在我的机器上使用g++编译(编译到“主机”)和使用交叉编译器的ARM处理器(在我的例子中是arm-cortex_a8-linux-gnueabi-g++)。我正在转换为C++0x/11标准,编译初始化列表时出现错误,我可以在以下代码段中重现该错误:intmain(void){charc[1]={-108};}这个程序看起来是正确的,因为-108是char的合法值。使用g++编译它不会产生以下命令行错误:g++example.cc-std=c++0x但是,当我使用交叉编译器进行编译时,如下所示:arm-cortex_a8-linux-gnueabi-g++examp

c++ - 初始化一个本身合法的引用成员?

这是我在使用Valgrind的服务器应用程序中发现的一个错误。structFoo{Foo(conststd::string&a):a_(a_){}conststd::string&a_;};使用gcc-Wall您不会收到警告。为什么是这个法典? 最佳答案 你所得到的违反了8.3.2/4A...引用应被初始化为引用一个有效的对象或函数。所以它肯定是非法的。请注意,并非所有错误程序都需要被编译器检测到,尽管老实说我会认为这是其中之一。不管怎样,打开了最大编译器警告的g​​++版本4.4.1也很乐意接受这个程序,而不会发出警告:intma

c++ - 像访问一维数组一样访问二维数组是否合法?

这个问题在这里已经有了答案:关闭10年前.PossibleDuplicate:MayItreata2Darrayasacontiguous1Darray?考虑以下代码:intarray2d[10][10];int*array1d=array2d[0];我从未听说过它不能工作的实现,但是通过array1d访问和操作array2d是否合法?标准的哪个部分允许这样做?标准中是否有任何内容阻止实现在每个二级数组之间插入额外的空间或填充(不是它需要的,但仍然需要)?额外问题:有没有一种方法可以将array2d作为int[100]访问,而不需要reinterpret_cast或C-风格一?

c++ - 是否可以合法地重载字符串文字和 const char*?

是否可以在C++11中重载constchar*和字符串文字(constchar[])?这个想法是避免在已知字符串长度时调用strlen来查找字符串长度。此代码段在G++4.8和Clang++3.2上中断:#include#include#includetemplatevoidlength(constT(&data)[N]){printf("%u[]\n",N-1);}templatevoidlength(constT*data){printf("*%u\n",(unsigned)strlen(data));}intmain(){length("hello");constchar*p="