2016-10-24 5 views
4

clang-cl (4.0.0-trunk) scheint ja zu denken, während vc2015 (update3) denkt nein.Sind Lambda-Funktionen nothrow_move_assignable?

Ist diese Implementierung definiert oder gibt der Standard vor, wie Lambda-Funktionen in Termen implementiert werden sollen oder nicht und zuweisbar?

#include <type_traits> 
#include <iostream> 

template <typename T> 
void test_nothrow_move_assignable(T&&) { 
    std::cout << std::boolalpha 
    << std::is_nothrow_move_assignable<T>::value 
    << "\n"; 
} 

int main() { 
    test_nothrow_move_assignable([]{}); 
    return 0; 
} 

// $ clang-cl.exe scratch.cpp 
// $ scratch.exe 
// true 

// $ cl /nologo /EHsc scratch.cpp 
// scratch.cpp 
// $ scratch.exe 
// false 
+0

Ich dachte nicht, dass Schließarten überhaupt belegbar sind. – aschepler

Antwort

4

Dies ist Clang Bug. Von [expr.prim.lambda]:

Der Verschluss-Typ mit einem Ausdruck Lambda-zugeordnet hat kein Default-Konstruktor und eine gelöschte Kopie Zuordnung Betreiber. Es hat einen Standard-Kopierkonstruktor und einen Standard-Move-Konstruktor (12.8).

Also sollte der Typ überhaupt nicht zuweisbar sein, viel weniger notwow move assignable.

+0

Der lustige Teil ist, dass ich begann, die Zeile direkt nach der Betonung zu lesen, während ich auf den Standard auf dem Handy schaute und die Aussage über den Kopierkonstruktor völlig verpasste. Guter Fang. +1 – skypjack

Verwandte Themen