C ++ 14 (그리고 이미 지원하는 Clang)에서 제공되는 변수 템플릿과 표준 is_same_v
및 유사 유형 특성에 대한 제안 을 통해 다음과 같이 새로운 유형 특성을 만들 수 있다는 것이 깔끔 할 것이라고 생각했습니다.
template<typename T>
constexpr bool is_const_and_volatile{std::is_const_v<T> && std::is_volatile_v<T>};
아아, 이로 인해 다음 SSCCE와 동일한 오류가 발생합니다 ( 아래에 언급 된 모든 내용 이 포함됨 ).
#include <type_traits>
template<typename T>
constexpr bool is_pointer{std::is_pointer<T>::value};
template<typename T>
constexpr bool foo{is_pointer<T>};
int main() {
//foo<int *>;
}
main
주석이 달린 줄과 함께 Clang은 다음을 뱉어냅니다.
경고 : 변수
is_pointer<type-parameter-0-0>
에 내부 연결이 있지만 정의되지 않았습니다.
그것은 (변경주의 나에게 정의 외모 T
에 int *
에서 foo
작품 벌금). 의 라인 주석을 main
인스턴스화가 foo
(다시 제공 T
에 int *
작품의 벌금)
오류 : constexpr 변수
foo<int *>
는 상수 표현식으로 초기화해야합니다.
그러나 foo
다음과 같은 이전 구문으로 바꾸면 두 인스턴스가 모두 제대로 작동합니다.
constexpr bool foo{std::is_pointer<T>::value};
변수 템플릿에 대해 내가 놓친 것이 있습니까? 새로운 변수 템플릿을 구축 할 수있는 방법이 함께 그들, 또는 내가 새로 구축하고 다른 코드를 사용하는 경우에만 문법 설탕을 즐길 수있는 오래된 구문을 사용하도록 강요입니까?
코드가 유효하며 clang SVN에서 승인되었습니다. 링크 오류는 내가 며칠 전에 수정 한 clang 버그 17846 으로 인해 발생했습니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다