在Stroustrup的示例中,冒号在“返回1:2”中是什么意思?

Pio*_*ñec 163 c++ syntax

我不了解冒号的一种特殊用法。

我在Bjarne Stroustrup的《 C ++编程语言》第四版第11.4.4节“调用和返回”的第297页中找到了它:

void g(double y)
{
  [&]{ f(y); }                                               // return type is void
  auto z1 = [=](int x){ return x+y; }                        // return type is double
  auto z2 = [=,y]{ if (y) return 1; else return 2; }         // error: body too complicated
                                                             // for return type deduction
  auto z3 =[y]() { return 1 : 2; }                           // return type is int
  auto z4 = [=,y]()?>int { if (y) return 1; else return 2; } // OK: explicit return type
}
Run Code Online (Sandbox Code Playgroud)

令人困惑的冒号出现在语句中的第7行return 1 : 2。我不知道那会是什么。它不是标签或三元运算符。

似乎是没有第一个成员(也没有?)的条件三元运算符,但是在那种情况下,我不了解它在没有条件的情况下如何工作。

S.M*_*.M. 205

这是一个错字。查看勘误表,了解C ++编程语言的第二版和第三版。该示例必须如下所示:

auto z3 =[y]() { return (y) ? 1 : 2; }
Run Code Online (Sandbox Code Playgroud)

  • 我个人经常使用`(cond)?a:为了清楚起见,它可以帮助我避免误读例如语句foo = x> y?通过代码浏览时,a:b`为foo​​ = x...。 (28认同)
  • 为什么是(y),而不仅仅是y? (11认同)
  • @LittleHelper那里不是真的需要。但是,在类似函数的宏中,最佳实践是将括号放在使用参数的地方,因为否则参数的扩展会产生意外的行为。考虑一个类似于函数的宏,将值“ foo(x)x * 2”加倍,并在其中使用“ foo(2 + 3)”对其进行调用。结果将是2+(3 * 2),因为参数按原样扩展,并且优先级规则接管。如果您的宏是“ foo(x)(x)* 2”,那么您将正确获得(2 + 3)* 2。Stroustrup可能习惯在各处使用该样式以确保编码安全。 (8认同)
  • @LittleHelper也许这是一种最佳实践,但我总是看到它是这样写的。也许是为了避免与更复杂的比较混淆... (7认同)
  • @Graham非常不可能。Stroustrup本质上不编写函数宏(C ++内联函数更好)。三元运算符更有可能具有一些复杂的优先级规则,因此最好习惯性地使用paren来阐明优先级。 (2认同)

Jer*_*fin 19

在我看来就像一个简单的错字。应该可能是:

auto z3 =[y]() { return y ? 1 : 2; }
Run Code Online (Sandbox Code Playgroud)

请注意,由于lambda不带任何参数,因此parens是可选的。如果您愿意,可以改用此方法:

auto z3 =[y] { return y ? 1 : 2; }
Run Code Online (Sandbox Code Playgroud)


Rem*_*eau 11

return 1 : 2; 是语法错误,不是有效的代码。

正确的陈述将更像是return (y) ? 1 : 2;