2017-03-18 11 views
0

다음 코드는 Clang (4.0) 및 GCC (6.3)로 컴파일되지만 MSVC (Visual Studio 2015 Update 1, Visual Studio 2017)에서는 실패합니다.MSVC가 인스턴스화없이 템플릿 사용을 거부해야합니까?

error C2219: syntax error: type qualifier must be after '*'

그러나, 다음 코드는 MSVC로 잘 컴파일 :

using ConstRestrictInt = ConstRestrict<int*>; 

이 컴파일러의 버그가

template <typename T> 
using ConstRestrict = T const __restrict; 

MSVC 오류를 방출? 표준이 이것에 대해 무엇이라고 말합니까?

+0

스 니펫에 오타가 아닌 [mcve]를 제공하십시오. 정확히 ** 컴파일되고 실행되지 않는 것은 무엇입니까? 양쪽 진술은 함께? 떨어져서? ';'을 의도적으로 삭제 했습니까? – Yakk

+0

아니요. 최소한의 완전하고 검증 가능한 예입니다. https://godbolt.org/g/pqrJFr –

답변

1

__restrict은 C++ (모든 버전)에서 유효한 키워드가 아니며 그 사용법은 구현을 위해 예약되어 있으므로 코드를 유효하게 만들 수있는 것은 없습니다 #define.

코드를 거부하는 MSVC는 표준을 준수합니다. 표준은 비표준 코드가 받아 들여 지도록 요구하지 않습니다.

나는이 방법을 라고하고 표준에 대한 귀하의 요청 때문에 대답합니다.

실제로는 __restrict 확장을 구현 한 버그 일 수 있습니다. 그러한 별칭을 거부하거나 동의해야합니다.