2015-09-11 15 views
6

は、私は、ラムダラムダ関数に属性を追加する方法は?

auto func = [](std::string msg) { throw std::runtime_error(msg); }; 

が(確かに、この例はほとんど意味がありませんが、それはポイントではありません)があるとします。これは、ラムダが、通常の関数でなかった場合、私は、これはまた、ラムダのために行うことができます

[[noreturn]] void func(std::string msg) { throw std::runtime_error(msg); } 

のようnoreturn属性でそれを宣言するのでしょうか? (私はしかし、任意の成功なし、打ち鳴らす3.5にはいくつかのバリエーションを試してみました。)Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)を使用して


編集、私は

auto func = [](std::string msg) -> [[noreturn]] void { throw std::runtime_error(msg); }; 

または

auto func = [](std::string msg) [[noreturn]] { throw std::runtime_error(msg); }; 

を試みたが、両方を拒否されました。これはclang 3.5の不完全/不具合ですか?

+3

[ラムダの演算子()をnoreturnとして宣言する方法](http://stackoverflow.com/q/26888805/1708801) –

+0

@ShafikYaghmour確かに。私は尋ねる前にそれを逃した。私の自身の質問を今やゥペルとしてマークしました... – Walter

答えて

0

グラム++ 4.9.3で、次の作品:あまりにhttp://ideone.com/49Ietf

void foo() 
{ 
    auto func = [] (std::string msg) [[noreturn]] { throw std::runtime_error(msg); }; 
} 

作品。

+0

愚か者への答えから、gcc 4.9.3は不正なコードを受け入れていたようです... – Walter

+0

@Walter、それはそうであるようです。ラムダ機能の使用を明示的に禁止するための標準化委員会の審議があったのだろうか。 –

+1

私はラムダを '' [noreturn] ''とすることはできないという事実は、標準の意図ではなく、その不幸な結果だと思います。 *ラムダ自体の 'operator()'に属性を適用する方法はありません。*また、言語拡張として上記のコードを受け入れることもできます。 – Walter

関連する問題