2015-09-11 17 views
6

Supponiamo che io sono un lambdaCome aggiungere un attributo ad una funzione lambda?

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

(è vero, questo esempio ha poco senso, ma non è questo il punto). Se questo non fosse un lambda, ma una funzione ordinaria, vorrei dichiaro con l'attributo noreturn come in

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

Può questo essere fatto anche per un lambda? (Ho provato diverse varianti con clang 3.5, ma senza successo.)


modifica Utilizzando Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn), ho provato

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

o

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

ma entrambi sono stati respinti. Questa è una incompletezza/bug di clang 3.5?

+3

Vedere [Come dichiarare un operatore lambda() come noreturn?] (Http://stackoverflow.com/q/26888805/1708801) –

+0

@ShafikYaghmour Effettivamente. L'ho perso prima di chiederlo. Contrassegnato la mia stessa domanda in duplice copia ... – Walter

risposta

0

le seguenti opere in g ++ 4.9.3:

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

Lavora in http://ideone.com/49Ietf troppo.

+0

Quindi, dalla risposta al dupe, sembra che gcc 4.9.3 accettasse codice mal formato ... – Walter

+0

@Walter, sembra essere il caso. Mi chiedo se nel comitato degli standard non vi sia stata alcuna deliberazione per proibire esplicitamente l'uso di '[[noreturn]]' per le funzioni lambda. –

+1

Penso che il fatto che non si possa attribuire un lambda a '[[noreturn]]' era/non è una intenzione dello standard, ma è una sfortunata conseguenza. * La lingua non consente in alcun modo di applicare un attributo all'operatore '()' di una lambda stessa. * In alternativa, si può accettare il codice sopra come estensione della lingua. – Walter