我可以在一行上写一个带有变量声明的if语句吗?

Zeb*_*ish 26 c++ if-statement

我想知道是否有办法把它放在一条线上?

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.
Run Code Online (Sandbox Code Playgroud)

我也尝试用额外的括号围绕它,但这似乎不起作用.我发现这在一条线上非常方便.

Pas*_* By 49

从C++ 17开始,您可以使用初始化if语句:

if (auto r = getGlobalObjectByName(word); !r) r->doSomething;
Run Code Online (Sandbox Code Playgroud)

语义是:

if (init-statement; condition) statement
Run Code Online (Sandbox Code Playgroud)

与"传统"if语句的唯一区别是init-statement,它初始化块作用域中的变量,类似于for循环.

  • @Shamtam然后'r`将是错误的 (4认同)
  • 我继续诅咒添加更多功能的语言,但我挖掘了一些东西.谢谢 (2认同)
  • 它可能是一个非指针类型,带有重载的` - >`运算符. (2认同)

Mar*_*ica 12

如果你有C++ 17,请使用if (init statement; condition)表单.如果没有,您有三种选择:

(注意,这需要r一个智能指针,该函数具有非常奇怪的语义operator bool().OTOH,我认为这实际上是一段简短的示例代码,而不是您的实际代码).

我想我只会使用else表单,如果将所有内容保存在一行非常重要(例如,保留代码的表格格式).