我想知道这段代码示例: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扩展还是标准行为?我在实践中从未见过这种情况。如果它是标准的,我会尽可能开始使用它。 最佳答案
所以thisanswer让我想到了将new的结果分配给指向const的指针的场景。AFAIK,在这种情况下,您没有理由不能合法const_castconstness并实际修改对象:structX{intx;};//....constX*x=newX;const_cast(x)->x=0;//okay但后来我想-如果你真的想要new创建一个const对象怎么办。所以我尝试了structX{};//....constX*x=newconstX;它编译好了!!!这是GCC扩展还是标准行为?我在实践中从未见过这种情况。如果它是标准的,我会尽可能开始使用它。 最佳答案
这主要是语言律师类的问题,我怀疑大多数实现会打扰,尤其是因为它可能会增加每个用户的编译时间。话虽如此:如果std::set的某些实现是使用每个实例的bitset和共享的256个值的静态数组实现的(因为键是const是安全的),那么根据(如果版本很重要,那么假设C++20)标准? 最佳答案 只要您遵守[set]部分中的标准规范,我认为没有任何限制会禁止您进行专门的实现。.对于set或set您需要32个八位字节来存储代表潜在成员的256位,具有非常快速的集合操作的优势。对于set你会消耗太多的内存,如果你有非常填充的集合,这只有在恕我直
这主要是语言律师类的问题,我怀疑大多数实现会打扰,尤其是因为它可能会增加每个用户的编译时间。话虽如此:如果std::set的某些实现是使用每个实例的bitset和共享的256个值的静态数组实现的(因为键是const是安全的),那么根据(如果版本很重要,那么假设C++20)标准? 最佳答案 只要您遵守[set]部分中的标准规范,我认为没有任何限制会禁止您进行专门的实现。.对于set或set您需要32个八位字节来存储代表潜在成员的256位,具有非常快速的集合操作的优势。对于set你会消耗太多的内存,如果你有非常填充的集合,这只有在恕我直
我有一个指针T*pValues我想将其视为T(&values)[N]在这个SO答案中https://stackoverflow.com/a/2634994/239916,建议这样做的方法是T(&values)[N]=*static_cast(static_cast(pValues));我对此的担忧是。在他的示例中,pValues以如下方式初始化TtheValues[N];T*pValues=theValues;我的问题是,如果pValues来自以下任何构造,则强制转换构造是否合法:1:TtheValues[N+M];//M>0T*pValues=theValues;2:T*pValue