首先,我见过thisquestionaboutC99并且接受的答案引用了C99标准草案中的operandisnotevaluate措辞。我不确定这个答案是否适用于C++03。还有thisquestionaboutC++有一个接受的答案,引用了类似的措辞,并且在某些情况下,会出现未评估的操作数。未计算的操作数不会被计算。措辞。我有这个代码:int*ptr=0;void*buffer=malloc(10*sizeof(*ptr));问题是-sizeof()内是否有空指针取消引用(以及UB)?C++035.3.3/1说sizeof运算符在其操作数的对象表示中产生字节数。操作数要么是一个未计算
我的(相对较旧的)C++编译器在this上卡住了Boost中的文件,开头为:#/*Copyright(C)2001#*HousemarqueOy#*http://www.housemarque.com#*#*DistributedundertheBoostSoftwareLicense,Version1.0.(See#*accompanyingfileLICENSE_1_0.txtorcopyat#*http://www.boost.org/LICENSE_1_0.txt)#*/#这真的是合法的C++吗?预处理器标记的语法规则是什么? 最佳答案
我的(相对较旧的)C++编译器在this上卡住了Boost中的文件,开头为:#/*Copyright(C)2001#*HousemarqueOy#*http://www.housemarque.com#*#*DistributedundertheBoostSoftwareLicense,Version1.0.(See#*accompanyingfileLICENSE_1_0.txtorcopyat#*http://www.boost.org/LICENSE_1_0.txt)#*/#这真的是合法的C++吗?预处理器标记的语法规则是什么? 最佳答案
我想知道这段代码示例:intmain(){char*p;chararr[100]="Hello";if((p=arr)[0]=='H')//dostuffs}这段代码实际上在C++03中格式正确吗?我的论点是=的副作用仅在下一个序列点之后完成,并且由于我们正在访问p=arr的结果,因此代码可能不是格式良好,=和[]操作之间没有顺序。我说的对吗?这种行为在C和C++11中得到了很好的定义。这段代码其实来源于MySQL。 最佳答案 当然是定义明确的。分配p=arr何时发生并不重要。您不是在评估p[0],而是在为(p=arr)的结果下标,
我想知道这段代码示例:intmain(){char*p;chararr[100]="Hello";if((p=arr)[0]=='H')//dostuffs}这段代码实际上在C++03中格式正确吗?我的论点是=的副作用仅在下一个序列点之后完成,并且由于我们正在访问p=arr的结果,因此代码可能不是格式良好,=和[]操作之间没有顺序。我说的对吗?这种行为在C和C++11中得到了很好的定义。这段代码其实来源于MySQL。 最佳答案 当然是定义明确的。分配p=arr何时发生并不重要。您不是在评估p[0],而是在为(p=arr)的结果下标,
考虑以下示例代码:classC{public:int*x;};voidf(){C*c=static_cast(malloc(sizeof(C)));c->x=nullptr;//如果我因任何原因不得不使用未初始化的内存(当然,如果可能,我会改为调用newC()),我仍然可以调用放置构造函数。但是如果我像上面一样省略这个,并手动初始化every成员变量,它会导致未定义的行为吗?IE。是在规避构造函数本身未定义的行为,还是用类外的一些等效代码替换调用它是否合法?(通过另一个关于完全不同的问题的问题遇到这个问题;询问好奇心......) 最佳答案
考虑以下示例代码:classC{public:int*x;};voidf(){C*c=static_cast(malloc(sizeof(C)));c->x=nullptr;//如果我因任何原因不得不使用未初始化的内存(当然,如果可能,我会改为调用newC()),我仍然可以调用放置构造函数。但是如果我像上面一样省略这个,并手动初始化every成员变量,它会导致未定义的行为吗?IE。是在规避构造函数本身未定义的行为,还是用类外的一些等效代码替换调用它是否合法?(通过另一个关于完全不同的问题的问题遇到这个问题;询问好奇心......) 最佳答案
在std::string中只有const成员来获取数据,如c_str()。但是,我可以通过operator[]获得对字符串第一个元素的引用,并且可以写入它。例如,如果我有函数:voidtoupper(char*first,char*last_plus_one);我可以直接写入vector以获得指向第一个元素的指针:vectormessage//has"SomeMessage";toupper(&message[0],&message[0]+message.size());我可以用std::string做同样的事情吗?stringmessage="SomeMessage";toupper
在std::string中只有const成员来获取数据,如c_str()。但是,我可以通过operator[]获得对字符串第一个元素的引用,并且可以写入它。例如,如果我有函数:voidtoupper(char*first,char*last_plus_one);我可以直接写入vector以获得指向第一个元素的指针:vectormessage//has"SomeMessage";toupper(&message[0],&message[0]+message.size());我可以用std::string做同样的事情吗?stringmessage="SomeMessage";toupper
所以thisanswer让我想到了将new的结果分配给指向const的指针的场景。AFAIK,在这种情况下,您没有理由不能合法const_castconstness并实际修改对象:structX{intx;};//....constX*x=newX;const_cast(x)->x=0;//okay但后来我想-如果你真的想要new创建一个const对象怎么办。所以我尝试了structX{};//....constX*x=newconstX;它编译好了!!!这是GCC扩展还是标准行为?我在实践中从未见过这种情况。如果它是标准的,我会尽可能开始使用它。 最佳答案