【发布时间】:2024-05-03 13:55:02
【问题描述】:
我想知道是否有办法把它放在一条线上?
if (auto r = getGlobalObjectByName(word)) r->doSomething; // This works fine
if (!auto r = getGlobalObjectByName(word)) r->doSomething; // Says "expected an expression"
if (auto r = getGlobalObjectByName(word) == false) r->doSomething; // Also doesn't work.
我也试过用额外的括号括起来,但这似乎不起作用。我发现这在一条线上真的很方便。
【问题讨论】:
-
作为旁注,我不鼓励尝试单行。事实上,我什至不鼓励您在条件various compilers actually treat that as a compiler warning 中使用赋值的返回值,因为它很容易导致错误。更不用说在该任务中添加第三步了。首先确保你的代码是可读的,简洁并不总是更好。
-
我看不懂重点。如果
r测试为false,则评估r->doSomething将给出未定义的行为,除非满足一组非常具体的条件(例如r属于某个类类型,该类类型提供operator!()或与bool相媲美,并提供operator->(),如果对象测试为false,则该operator->()不会产生空指针) -
@CoryKramer 这不是赋值,而是初始化,没有编译器会为此发出警告。当变量在
if构造之前声明时,您必须将其与编译器给出的赋值警告混淆。在这种情况下,它可以保护您不使用分配而不是等价。但这是不同的,不能混淆。 -
赞成编译器不会警告的评论,我仍然认为这种过度简洁通常是一个坏主意。
-
auto r = getGlobalObjectByName(word) == false意思是auto r = (getGlobalObjectByName(word) == false)
标签: c++ if-statement