在 Stroustrup 的例子中,“ return 1:2”中的冒号是什么意思?

我不明白冒号的一个特殊用法。

我在《比雅尼·斯特劳斯特鲁普》第4版第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语句中。我不知道会是什么。这不是一个标签或三元运算符。

它看起来像一个没有第一个成员(也没有 ?)的条件三元运算符,但是在这种情况下,我不明白在没有条件的情况下它是如何工作的。

11212 次浏览

这是书上的一个打字错误。看看 C++程式语言第二次和第三次印刷勘误表。这个例子必须像下面这样:

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

在我看来就是个简单的打印错误,应该是:

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

注意,因为 lambda 不接受任何参数,所以括号是可选的。如果你愿意,你可以用这个代替:

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

return 1 : 2;是一个语法错误,它是无效的代码。

正确的语句更像是 return (y) ? 1 : 2;