2016-10-24 2 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

클로저 유형이 이동 할당 가능하다고 생각하지 않았습니다. – aschepler

답변

4

이것은 결투 버그입니다. [expr.prim.lambda]에서 :

람다 표현과 관련된 닫는 방법의 종류에는 기본 생성자와 삭제 복사 할당 연산자이 없습니다. 그것은 디폴트 복사 생성자와 기본 이동 생성자 (12.8)를 가지고있다.

따라서 형식을 할당 할 수 없도록 이동하면 안됩니다.

+0

재미있는 부분은 모바일 표준을 보면서 강조한 직후에 줄을 읽기 시작했고 복사 생성자에 대한 진술을 완전히 놓쳤다는 것입니다. 좋은 캐치. +1 – skypjack