2011-12-20 14 views
4

この例を考えてみましょう推論することはできません。GCC 4.6.1でコンパイラの警告:ラムダ戻り値の型が

#include <algorithm> 
#include <iostream> 

int main() 
{ 
    std::string str = "abcde4fghijk4l5mnopqrs6t8uvwxyz"; 
    std::string str2; 

    std::remove_copy_if(str.begin(), str.end(), 
     std::back_inserter(str2), 
     [](char& c) { 
      if (std::isdigit(c)) 
       return true;  // <----- warning here 
      else 
       return false; 
     } 
    ); 

    std::cout << str2 << '\n'; 
} 

を、これは予想される罰金とプリント出力(アルファベット)をコンパイルしますが、私は「ラムダリターンを言って警告を受けます戻り値が関数本体 ""内の唯一の文である場合にのみ、型を推論できます。

私は警告を取り除く方法を知っています(末尾の戻り値の型を使用するか、単にreturn isdigit(c);と言っています)が、コンパイラは何も警告しないので不思議です。おそらくこのようなコードで間違っていますか?スタンダードはそれについて何か言いますか?

+3

標準は、それが悪い形成なので、コンパイラは、少なくとも警告を表示することが義務付けられていると言うと、それをすべてでコンパイルすることを拒否して自由です(他のコンパイラが行う可能性が高いため)。 – ildjarn

+1

@ildjarnなぜそれが悪いのかについて、あなたは標準を引用できますか? –

+0

@VJovic:今は時間がないので、答えではなくコメントです。 :-) – ildjarn

答えて

5

@ildjarnは彼のコメントで、あなたのコードは標準に従って単純に不正な形になっていると述べています。

§5.1.2 [expr.prim.lambda] p4

[...] ラムダ式トレーリング戻り型が含まれていない場合トレーリング戻り型が示した場合のように、それは次のタイプ:

  • 化合物文フォーム
    のであれば属性指定子seq optreturn; }
    左端から右端への変換(4.1)、配列からポインタへの変換 (4.2)、および関数からポインタへの変換(4.3)の後に返される式の型。
  • その他の場合、void。基本的には、中括弧(標準でcompund文と呼ばれる)内のコードはreturn some_expr;以外のものであれば、標準の戻り値の型を言うことだ

[...]

、あなたはvoidの返品タイプを取得します。

+0

...これは、値を持つ 'return'ステートメントを検出すると、OPの例でコンパイラエラーが発生します。 – rodrigo

+0

@rodrigo:正解、atleast * should *。 GCCは、それが返すタイプの控除と少し寛大です。 – Xeo

+0

@rodrigo:いいえ、それは単に形が悪いだけです。コンパイラは不正な形式のコードを拡張子として自由に受け入れることができますが、少なくともこの場合はGCCが行う警告(§1.4/ 8)を表示する義務があります。 – ildjarn

3

この問題はC++で修正されています14。言語はOPが期待する戻り値の型を正しく推定するようになりました。ドラフト標準[7.1.6.4.11]から:

undeducedプレースホルダタイプを持つエンティティのタイプは、式の型を決定するために を必要とされる場合、プログラムは、病気に形成されています。 関数内でreturnステートメントが見られると、 の戻り値の型は、他のreturnステートメントを含む 関数の残りの部分で使用できます。[例:

auto n = n; // error, n’s type is unknown 
auto f(); 
void g() { &f; } // error, f’s return type is unknown 
auto sum(int i) { 
if (i == 1) 
    return i; // sum’s return type is int 
else 
    return sum(i-1)+i; // OK, sum’s return type has been deduced 
} 

末端例]

関連する問題