상황은와 정확히 유사합니다 noexcept(noexcept(...))
. 물론 이것은 좋은 것보다 나쁜 것 같지만 설명하겠습니다. :) 우리는 당신이 이미 알고있는 것으로 시작할 것입니다 :
C ++ 11에는 " noexcept
-clauses"및 "-expressions"가 noexcept
있습니다. 그들은 다른 일을합니다.
noexcept
-clause는 "이 기능은 말했다 때 ... noexcept해야한다 (일부 조건)." 함수 선언을 진행하고 부울 매개 변수를 사용하여 선언 된 함수에서 동작 변경을 발생시킵니다.
noexcept
-expression는 "컴파일러는 말한다 여부를 말해주십시오 (일부 표현) noexcept입니다." 그 자체가 부울 표현식입니다. 프로그램 동작에 "부작용"이 없습니다. 예 / 아니오 질문에 대한 답변을 컴파일러에 요청하는 것입니다. "이 표현은 예외가 아닌가?"
우리는 할 수 둥지 noexcept
, 안쪽 -expression noexcept
-clause을하지만, 우리는 일반적으로 그것을 그렇게 나쁜 스타일을 고려한다.
template<class T>
void incr(T t) noexcept(noexcept(++t)); // NOT SO HOT
noexcept
-expression을 type-trait 로 캡슐화하는 것이 더 나은 스타일로 간주됩니다 .
template<class T> inline constexpr bool is_nothrow_incrable_v =
noexcept(++std::declval<T&>()); // BETTER, PART 1
template<class T>
void incr(T t) noexcept(is_nothrow_incrable_v<T>); // BETTER, PART 2
C ++ 2a 작업 초안에는 " requires
-clauses"및 "-expressions"가 requires
있습니다. 그들은 다른 일을합니다.
- requires
절은 "이 함수 는 ... (일부 조건) 일 때 과부하 해결에 참여해야합니다. "라고 말합니다 . 함수 선언을 진행하고 부울 매개 변수를 사용하여 선언 된 함수에서 동작 변경을 발생시킵니다.
- requires
컴파일러는 "컴파일러, (일부 표현식 세트)가 제대로 구성되어 있는지 알려주십시오 ." 그 자체가 부울 표현식입니다. 프로그램 동작에 "부작용"이 없습니다. 예 / 아니오 질문에 대한 답변을 컴파일러에 요청하는 것입니다. "이 표현이 잘 구성되어 있습니까?"
우리는 할 수 둥지 requires
, 안쪽 -expression requires
-clause을하지만, 우리는 일반적으로 그것을 그렇게 나쁜 스타일을 고려한다.
template<class T>
void incr(T t) requires (requires(T t) { ++t; }); // NOT SO HOT
requires
타입 표현에 표현 을 캡슐화하는 것이 더 나은 스타일로 간주됩니다 ...
template<class T> inline constexpr bool is_incrable_v =
requires(T t) { ++t; }; // BETTER, PART 1
template<class T>
void incr(T t) requires is_incrable_v<T>; // BETTER, PART 2
... 또는 (C ++ 2a Working Draft) 개념.
template<class T> concept Incrable =
requires(T t) { ++t; }; // BETTER, PART 1
template<class T>
void incr(T t) requires Incrable<T>; // BETTER, PART 2
noexcept(noexcept(...))
.