c – 逗号运算符,return语句和nullptr没有副作用?
参见英文答案 >
gcc nullptr issue1个
我有以下测试代码: #include <cstdint> #include <cassert> enum class Result : std::uint32_t {SUCCESS = 0,INSUCCESS = 1}; void* func(Result& result) { // works great /* result = Result::INSUCCESS; return NULL; */ // error: invalid conversion from ‘long int’ to ‘void*’ [-fpermissive] /* return result = Result::INSUCCESS,NULL; */ // compiles,but <result> is not set??? return result = Result::INSUCCESS,nullptr; } void testReturnWithSideEffects() { Result result = Result::SUCCESS; func(result); assert(result == Result::INSUCCESS); } 这里有两个问题但我对第二个问题最感兴趣: 为什么没有设置结果? 编辑: return result = Result::INSUCCESS,nullptr; 以下内容: return result = Result::INSUCCESS,(void*)NULL; 附加说明:当然我的生产场景是另一种指针类型(不是void *),但为了说明的目的我进行了简化. 另一个注意事项:从解决方法中你可以看出,这个nullptr有一些可疑的东西.我猜测不编译的示例行应该实际编译,并且这两个问题可能以某种方式相关. 和第三和最后一点,那些谁介绍的“挂羊头卖狗肉”或者我的代码“不可读性”:可读性在很大程度上是一个主观的问题,比如我可以说,这样的简写可以使代码更有条理这实际上可以帮助现货缺陷. 解决方法
第二种情况:
return result = Result::INSUCCESS,nullptr; 看起来像一个gcc bug,如果我将return语句更改为this(see it live),它似乎在return语句的上下文中忽略了逗号运算符的左侧: return (printf("hellon"),nullptr); 没有输出,但如果我们在return语句之外执行此操作,则会得到预期结果.它看起来固定在4.8但我可以用4.6和4.7重现. 如果我们看一下draft C++ standard部分5.18 Comma运算符,它说(强调我的):
无论如何,正如几个人已经提到的那样,这段代码很聪明但难以阅读,因此难以维护,将其拆分为两行也能正常工作.我总是想记住这个quote from Brian Kernighan(可能还有其他几个版本):
对于第一种情况,如果我们查看4.10节指针转换(错过我的未来),则错误是有效的:
表达方式: result = Result::INSUCCESS,NULL 不是一个常量表达式,因为它包含=,5.19常量表达式中包含什么是常量表达式,并说:
包括:
使用nullptr是可以的,因为它是std :: nullptr_t的prvalue,我们可以从12.14.7节指针文字看到:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |