2016-11-24 8 views
8

내가 래퍼 형is_nothrow_move_constructible <T>에 따라 래퍼 유형 X의 이동 생성자 X <T> noexcept를 어떻게 선언 할 수 있습니까?

template <typename T> 
struct X {/*..*/}; 

이 있다고 가정하고 내가 할 수있는 단지 X(X&&) = default 내가 거기가 아닌 사소한 물건을 할 필요가 있기 때문이다.

그러나 이 noexcept 인 경우에만 noexcept이되고 싶습니다. 이것은 ::std::is_nothrow_move_constructible으로 테스트 할 수 있습니다.

constexpr에 따라 한 버전의 생성자 또는 다른 버전을 조건부로 활성화하는 방법이 손실되었습니다. SFINAE를 사용할 수있는 방법이있을 수 있지만 그 방법을 ctors에 적용하는 방법은 없습니다.

답변

9

noexcept 지정은 부울 상수 표현식을 허용, 그래서 당신은 할 수 있지만이 직접 당신의 유형 특성 검사 :

template <typename T> 
struct X { 
    X(X&&) noexcept(std::is_nothrow_move_constructible<T>::value) {} 
}; 
+0

Ooooookay, 즉 쉬웠다. 건배. (1 시간 안에 받아 들일 것입니다.) – bitmask

+0

다음과 같은 경우에 이것을 사용하고 있습니다. 누군가가 궁금해 할 때를 대비하여 ... http://codereview.stackexchange.com/q/147999/7189 – bitmask