C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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);
}

这里有两个问题但我对@R_489_8315@最感兴趣:

为什么没有设置结果?

编辑:
感谢大家的确认.我决定使用的解决方法是替换:

return result = Result::INsuccesS,nullptr;

以下内容

return result = Result::INsuccesS,(void*)NULL;

附加说明:当然我的生产场景是另一种指针类型(不是void *),但为了说明的目的我进行了简化.

一个注意事项:从解决方法中你可以看出,这个nullptr有一些可疑的东西.我猜测不编译的示例行应该实际编译,并且这两个问题可能以某种方式相关.

和第三和最后一点,那些谁介绍的“挂羊头卖狗肉”或者我的代码“不可读性”:可读性在很大程度上是一个主观的问题,比如我可以说,这样的简写可以使代码更有条理这实际上可以帮助现货缺陷.

解决方法

第二种情况:
return result = Result::INsuccesS,nullptr;

看起来像一个gcc bug,如果我将return语句更改为this(@L_616_12@),它似乎在return语句的上下文中忽略了逗号运算符的左侧:

return (printf("Hello\n"),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节指针文字看到:

大佬总结

以上是大佬教程为你收集整理的c – 逗号运算符,return语句和nullptr没有副作用?全部内容,希望文章能够帮你解决c – 逗号运算符,return语句和nullptr没有副作用?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。