8

私はコードを書いていますが、最近、g++ が特定のクラスの問題について警告しないことがわかりました: C++11 5.1.2.4 ごとに、ラムダが単一の return ステートメントでない場合、戻り値の型末尾の戻り型として宣言するか、無効にする必要があります。

十分な意味がある場合、g++ は無効なコードをコンパイルすることを許可されていますが、この動作をオフにする方法 ( -fpedanticg++-4.7 で許可されている) または少なくともそれについて警告する方法はありますか?

コード例:

[]() { return 0; } //is fine
[&a]() { a++; return 0; } //is not fine but g++ doesn't warn me
[&a]() -> int {a++; return 0; } //is fine again

C++11 5.1.2.4

実装は、右辺値参照型のメンバーをクロージャー型に追加してはなりません。ラムダ式にラムダ宣言子が含まれていない場合は、ラムダ宣言子が () であるかのようになります。lambda-expression に Trailing-return-type が含まれていない場合は、trailing-return-type が次の型を示しているかのようになります。

— 複合文の形式が
{ attribute-specifier-seq(opt) return expression ; の場合。左辺値から右辺値への変換 (4.1)、配列からポインターへの変換 (4.2)、関数
からポインターへの変換 (4.3) の後に返される式の型。

— それ以外の場合は無効です。

4

2 に答える 2

11

これは、標準の欠陥であり、変更されるためです ( DR 975を参照)。

975 ラムダの戻り型控除に関する制限

ラムダの本体が単一の return ステートメントで構成されている場合にのみ、ラムダの戻り値の型を推定できるという現在の制限を必要とする技術的な問題はないようです。特に、すべてが同じ型を返す場合、複数の return ステートメントが許可される可能性があります。

オフにする方法があるかどうかは疑問です。

于 2013-01-22T02:35:37.410 に答える
1

GCC 4.8.1 (およびおそらくそれ以前) および clang 3.3 では既に実装されています。DR975の修正。

現在、C++1y に組み込むための提案 ( http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3386.html ) があります。

于 2013-10-15T09:19:11.670 に答える