应该MSVC在没有实例化的情况下拒绝模板化使用

时间:2017-03-18 01:32:46

标签: c++ gcc visual-c++ clang language-lawyer

以下代码使用Clang(4.0)和GCC(6.3)编译,但在MSVC(Visual Studio 2015 Update 1,Visual Studio 2017)中失败。

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

MSVC发出错误:

  

错误C2219:语法错误:类型限定符必须在'*'

之后

但是,以下代码可以很好地编译MSVC:

using ConstRestrictInt = ConstRestrict<int*>;

这是编译器错误吗?标准对此有何看法?

1 个答案:

答案 0 :(得分:1)

__restrict不是C ++(任何版本)中的有效关键字,并且它的使用是为实现保留的,因此您无需#define来使代码有效。

MSVC拒绝您的代码符合标准。该标准没有要求接受非标准代码。

我的回答是这样的,因为它是以及您对标准所说的要求。

实际上,它可能是其__restrict扩展名实施的错误。它应该拒绝这样的别名或接受它。