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


163

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

我在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
}

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

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


6
我这是一个编译错误(gcc和clang)。加上所有这些行都需要分号,但仍然是一个错误。
Cruz Jean

216
主持人注:在投票结束这个“典型”问题之前,请仔细考虑。是的,问题出在错字,但不是问问者的错字。而是在已出版的书中找到的。这意味着这个问题及其答案可能对将来的其他人很有用,这是将其作为错字来结束的强有力的反指示。(更新:现在正在Meta上讨论此主题;请随时在其中称重。)
Cody Gray

3
最好的答案可能是:尝试编译代码;如果它不能编译,则表明它是一个错字。
jrw32982支持莫妮卡

我能想到的一些例子把我的头是无法编译(甚至造成内部编译器错误)上一个编译器的顶部,但没有问题接受在不同的一个
J.安东尼奥·佩雷斯

1
@John我只是用MSVC尝试了一些折叠表达式,但它们没有编译。显然,我刚刚阅读的整个章节一定是错字?;)C ++编译器始终无法编译有效的C ++代码,这是由于该语言异常复杂。
Voo

Answers:


205

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

auto z3 =[y]() { return (y) ? 1 : 2; }

11
为什么(y)而不仅仅是y
小帮手

7
@LittleHelper也许这是一种最佳实践,但我总是看到它是这样写的。也许是为了避免与更复杂的比较产生混淆……
Redwolf Programs,

28
就个人而言,我经常使用(cond) ? a : b的清晰度-它可以帮助我避免误读,例如语句foo = x > y ? a : bfoo = x ...通过代码飞掠时。
user1686

8
@LittleHelper那里不是真的需要。但是,在类似函数的宏中,最佳实践是将括号放在使用参数的地方,因为否则参数的扩展会产生意外的行为。考虑一个类似于函数的宏,将值“ foo(x)x * 2”加倍,并在其中使用“ foo(2 + 3)”进行调用。结果将是2+(3 * 2),因为参数会按原样扩展,并且优先级规则将接管。如果您的宏是“ foo(x)(x)* 2”,那么您将正确获得(2 + 3)* 2。可能Stroustrup习惯于到处使用该样式以确保编码安全。
格雷厄姆

2
@Graham非常不可能。Stroustrup本质上不编写函数宏(C ++内联函数更好)。三元运算符更有可能具有一些复杂的优先级规则,因此最好习惯性地使用parens来阐明优先级。
马丁·邦纳

19

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

auto z3 =[y]() { return y ? 1 : 2; }

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

auto z3 =[y] { return y ? 1 : 2; }

11

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.