以下代码使用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*>;
这是编译器错误吗?标准对此有何看法?
答案 0 :(得分:1)
__restrict
不是C ++(任何版本)中的有效关键字,并且它的使用是为实现保留的,因此您无需#define
来使代码有效。
MSVC拒绝您的代码符合标准。该标准没有要求接受非标准代码。
我的回答是这样的,因为它是language-lawyer以及您对标准所说的要求。
实际上,它可能是其__restrict
扩展名实施的错误。它应该拒绝这样的别名或接受它。