2015-09-11 16 views
6

Załóżmy, że mam lambdaJak dodać atrybut do funkcji lambda?

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

(co prawda, w tym przykładzie nie ma większego sensu, ale to nie o to chodzi). Gdyby tak nie było lambda, ale zwykła funkcja, chciałbym zadeklarować ją z atrybutem noreturn jak w

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

można to również zrobić za pomocą lambda? (Próbowałem kilka odmian z brzękiem 3.5, ale bez powodzenia.)


edit Korzystanie Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) starałem

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

lub

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

ale oba zostały odrzucone. Czy to jest niekompletność/błąd clang 3.5?

+3

Zobacz [Jak zadeklarować operator lambda() jako noreturn?] (Http://stackoverflow.com/q/26888805/1708801) –

+0

@ShafikYaghmour Rzeczywiście. Tęskniłem za tym przed pytaniem. Oznaczone moje własne pytanie jako dupe teraz ... – Walter

Odpowiedz

0

następujące prace w g ++ 4.9.3:

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

pracuje w http://ideone.com/49Ietf też.

+0

Więc od odpowiedzi na dupe, wydaje się, że gcc 4.9.3 akceptował źle sformułowany kod ... – Walter

+0

@Walter, Wydaje się, że tak jest. Zastanawiam się, czy w komisji normalizacyjnej nie było żadnych naruszeń, aby wyraźnie zakazać używania '[[noreturn]]' dla funkcji lambda. –

+1

Myślę, że fakt, że nie można przypisać lambda z '[[noreturn]]' był/nie jest intencją standardu, ale jego niefortunną konsekwencją. * Język nie ma możliwości zastosowania atrybutu do 'operator()' samej lambda. * Alternatywnie, można zaakceptować powyższy kod jako rozszerzenie języka. – Walter

Powiązane problemy