Stroustrupの例では、「return 1:2」でコロンは何を意味しますか?


163

コロンの特定の使用法が1つわかりません。

私はそれをBjarne Stroustrup 著のC ++プログラミング言語、第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ます。それが何であるか私にはわかりません。ラベルや三項演算子ではありません。

最初のメンバーなし(およびなし?)の条件付き3項演算子のように見えますが、その場合、条件なしでどのように機能するのかわかりません。


6
私の最後のコンパイルエラーです(gccとclang)。さらに、これらすべての行にはセミコロンが必要ですが、それでもエラーが発生します。
Cruz Jean

216
モデレーターのメモ:投票を行う前に、これを「タイプミス」の質問として締めくくるには、十分に注意してください。はい、問題はタイプミスですが、質問者が作成したタイプミスではありません。むしろ、それは出版された本に見られるものです。つまり、この質問とその回答は、将来、他の人にも役立つ可能性があります。これは、タイプミスとしてクローズするための強力な反指標です。(更新:このトピックは現在Metaで議論されています。お気軽に検討してください。)
Cody Grey

3
おそらく最良の答えは次のとおりです。コードをコンパイルしてみてください。コンパイルできない場合は、それがタイプミスであることを示しています。
jrw32982は、

1つのコンパイラでコンパイルに失敗する(または内部コンパイラエラーが発生する)が、別のコンパイラでは問題なく受け入れられるいくつかの例を頭に浮かび上がらせることができます
J. Antonio Perez

1
@ジョン私はMSVCでいくつかのフォールド式を試したところ、コンパイルできませんでした。それで、私が読んだばかりの章全体がタイプミスに違いないのは明らかですか?;)C ++コンパイラは常に有効なC ++コードのコンパイルに失敗します。これは、言語がとてつもなく複雑なためです。
Voo

回答:


205

それは本の誤植です。C ++プログラミング言語の2番目と3番目の印刷についてはエラッタを参照してください。例は以下のようでなければなりません:

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

11
なぜ(y)だけではなくy
リトルヘルパー

7
@LittleHelper多分それはベストプラクティスか何かで、私はいつもそのように書かれているのを見ます。より複雑な比較との混乱を避けるためかもしれません...
Redwolfプログラム

28
個人的には、(cond) ? a : bわかりやすくするためによく使用します。これにより、コードを読み飛ばすときのfoo = x > y ? a : bようfoo = x ...に、ステートメントを読み間違えるのを防ぐことができます。
user1686

8
@LittleHelperそれは本当に必要ではありません。ただし、関数のようなマクロでは、引数を使用する場所に括弧を付けることをお勧めします。そうしないと、引数を展開すると予期しない動作が発生する可能性があります。「foo(2 + 3)」で呼び出す「foo(x)x * 2」という値を2倍にする関数のようなマクロを考えてみましょう。引数はそのまま拡張され、優先順位ルールが引き継ぐため、結果は2+(3 * 2)になります。マクロが「foo(x)(x)* 2」の場合、(2 + 3)* 2が正しく取得されます。Stroustrupはコーディングの安全のためにどこでもそのスタイルを使用する癖があるのか​​もしれません。
グラハム、

2
@グラハム非常にありそうもない。Stroustrupは基本的に関数マクロを記述しません(C ++インライン関数の方が優れています)。より可能性が高いのは、3項演算子の優先順位ルールが多少複雑であるため、括弧で優先順位を習慣的に明確にすることをお勧めします。
Martin Bonnerがモニカ

19

単純なタイプミスのように見えます。おそらく:

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

ラムダはパラメータを取らないため、括弧はオプションです。必要に応じて、代わりにこれを使用できます。

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

11

return 1 : 2; 構文エラーです。有効なコードではありません。

正しい文は、return (y) ? 1 : 2;代わりに似ています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.