草庐IT

合法性

全部标签

PHP:$this->something->($this->foo)->bar 合法吗?

这行PHP合法吗?$this->mongo->($this->db)->$collection_name->insert($document_name);如果$this->db是一个带有要使用的db名称的常量。谢谢 最佳答案 尝试使用花括号代替括号:$this->mongo->{$this->db}->$collection_name->insert($document_name);或者将$this->db分配给本地变量并使用它来代替:$db_name=$this->db;$this->mongo->$db_name->$colle

c++ - C++11 中的空宏参数合法吗?

我有时会故意省略宏参数。例如,对于类似函数的宏,如#defineMY_MACRO(A,B,C)...我可以这样调用它:MY_MACRO(,bar,baz)技术上仍有3个参数;只是第一个是“空的”。这个问题与可变参数宏无关。当我这样做时,我会在使用-ansi进行编译时收到来自g++的警告。(又名-std=c++98),但当我使用-std=c++0x时不会.这是否意味着空宏参数在新的C++标准中是合法的?这就是我的全部问题,但期待“你为什么要这样做?”回应,这是一个例子。我喜欢保持.h文件不受函数体的干扰,但是在.h文件之外实现简单的访问器是乏味的。因此,我编写了以下宏:#defineIM

c++ - 为什么 'int i = i;' 合法?

这个问题在这里已经有了答案:关闭10年前.PossibleDuplicate:intvar=1;voidmain(){inti=i;}以下代码在g++和VisualC++下都可以通过编译。为什么是合法的?看起来不合理,可能会导致隐藏的bug。intmain(){inti=i;} 最佳答案 编辑:它在语法上是合法的,但如果你使用x会导致未定义的行为。这是不合法的,因为您将一个未初始化的变量分配给另一个(嗯,相同的)未初始化的变量。仅仅因为它编译并不意味着它是合法的。这是有效的C++语法,是的,但不合法。赋值运算符的右侧必须在赋值时进行

c++ - 为什么将 "pointer to pointer to non-const"转换为 "pointer to pointer to const"是不合法的

将指向非常量的指针转换为指向常数的指针是合法的。那么为什么将指向非const的指针转换为指向const的指针是不合法的呢?例如,为什么下面的代码是非法的:char*s1=0;constchar*s2=s1;//OK...char*a[MAX];//akachar**constchar**ps=a;//error! 最佳答案 来自标准:constcharc='c';char*pc;constchar**pcc=&pc;//notallowed*pcc=&c;*pc='C';//wouldallowtomodifyaconstobjec

c++ - 覆盖 std::string 空终止符合法吗?

在C++11中,我们知道std::string保证是连续的和空终止的(或者更迂腐,由charT()终止,在char的情况下是空字符0)。我需要使用这个CAPI来通过指针填充字符串。它写入整个字符串+空终止符。在C++03中,我总是被迫使用vector,因为我不能假设string是连续的或空终止的。但是在C++11中(假设有一个完全符合的basic_string类,这在某些标准库中仍然存在问题),我可以。或者我可以吗?当我这样做时:std::stringstr(length);字符串将分配length+1字节,最后一个由空终止符填充。那挺好的。但是当我把它传递给CAPI时,它会写成len

c++ - 编译器降低程序的时间复杂度是否合法?这被认为是可观察的行为吗?

(注意:这是一个language-lawyer问题;我不是指任何特定的现有编译器。)何时允许编译器降低程序的时间复杂度?在什么情况下(如果有的话)这被认为是“可观察的行为”,为什么?(例如,编译器可以合法地将多项式时间程序“减少”为指数时间程序吗?)如果答案在C和C++中不同,或者在两者的不同版本中不同,请解释差异。 最佳答案 C标准实际上并没有时间复杂度模型,无论是对于它的原始操作还是它的库函数,所以编译器可以做几乎任何事情来保留程序语义(可观察的行为)。C++标准仅为其某些库函数提供复杂性保证,并表示(17.5.1.4[stru

c++ - if (condition) try {...} 在 C++ 中合法吗?

例如:if(true)try{//worksasexpectedwithbothtrueandfalse,butisitlegal?}catch(...){//...}换句话说,将try-block放在if条件之后是否合法? 最佳答案 tryblock(在C++中是statement)的语法是trycompound-statementhandler-sequence而if的语法是:attr(optional)if(condition)statement_trueattr(optional)if(condition)statement

c++ - 在 C++ 中递归到 main() 是否合法?

这个问题在这里已经有了答案:CanmainfunctioncallitselfinC++?(9个回答)关闭4年前。我读到C++标准在main()中禁止递归,但是g++编译下面的代码毫无怨言:intmain(){main();}谁能澄清一下? 最佳答案 根据3.6.1/3中的标准,不是:Thefunctionmainshallnotbeused(3.2)withinaprogramused的定义是:Anobjectornon-overloadedfunctionisusedifitsnameappearsinapotentially-

c++ - sizeof(void()) 是合法的表达式吗?

来自[5.3.3/1],我发现:The sizeof operatorshallnotbeappliedtoanexpressionthathasfunctionorincompletetype来自[3.9/5]我发现:Incompletely-definedobjecttypesand cvvoid are incompletetypes无论如何,对于sizeof不评估它的操作数,我会说sizeof(void())是一个合法的表达式(实际上是GCC编译它和结果是1)。另一边,来自here,在讨论sizeof时没有提到void,既没有提到大小为1的类型,也没有在具有实现定义的列表中大小

c++ - 在结构中,使用一个数组字段访问另一个数组字段是否合法?

例如,考虑以下结构:structS{inta[4];intb[4];}s;写s.a[6]并期望它等于s.b[2]是否合法?就个人而言,我觉得它必须是C++中的UB,而我不确定C。但是,我没有找到任何与C和C++语言标准相关的内容。更新有几个答案建议确保没有填充的方法字段之间,以使代码可靠地工作。我想强调如果这样的代码是UB,那么没有填充是不够的。如果是UB,那么编译器可以自由假设对S.a[i]和S.b[j]的访问不会重叠并且编译器可以自由地重新排序此类内存访问。例如,intx=s.b[2];s.a[6]=2;returnx;可以转化为s.a[6]=2;intx=s.b[2];retur