2016-10-24 3 views
4

clang-cl(4.0.0-trunk)はvc2015(update3)はいいとは思わないのですが、そう思えるようです。ラムダ関数はnothrow_move_assignableですか?

この実装は定義されていますか、または標準は、ラムダ関数をどのように実装するか、割り当てないで移動するかどうかを決定しますか?

#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

私はクロージャのタイプがmove assignableであるとは思わなかった。 – aschepler

答えて

4

これはクランバです。 【expr.prim.lambda]から:

ラムダ式に関連付けられている閉鎖型にはデフォルトコンストラクタと削除コピー代入演算子 を有していません。デフォルトのコピーコンストラクタとデフォルトのムーブコンストラクタ(12.8)があります。

したがって、タイプは割り当て可能ではありません。

+0

面白いところは、モバイルで標準を見ながら、あなたの強調の直後に行を読み始め、コピーコンストラクタについての記述を完全に見逃したことです。良いキャッチ。 +1 – skypjack