C++ 如果我的模板类型首先作为lambda参数出现,MSVC将引发一个奇怪的错误
考虑以下代码:C++ 如果我的模板类型首先作为lambda参数出现,MSVC将引发一个奇怪的错误,c++,visual-studio,visual-c++,C++,Visual Studio,Visual C++,考虑以下代码: #define SOLUTION 0 template <class T> constexpr int one = 1; template <class T> struct A { static constexpr int o = one<A<T>>; void call() { static_assert(one<A<T>> == 1, "Failure");
#define SOLUTION 0
template <class T>
constexpr int one = 1;
template <class T>
struct A {
static constexpr int o = one<A<T>>;
void call() {
static_assert(one<A<T>> == 1, "Failure");
}
};
int main() {
#if SOLUTION
A<int> object;
#endif
[](A<int> a) {
a.call();
};
return 0;
}
有趣的是,当我为解决方案
宏输入1时,它成功构建。唯一的区别是未使用的对象在编译器到达lambda定义之前,code>变量在main
的作用域中定义
如果在main之前,我定义了这样一个函数,这也是非常好的:
void f(A<int>& a) {
a.call();
}
无效f(A&A){
a、 call();
}
事实上,它和变量定义一样很好地解决了这个问题
这是编译器错误还是上述代码块违反了标准?引用:
在VS2017更新3上编译,但不在(RTM)更新2上编译
我也在我的机器上确认了这种行为。这意味着相关的更正已经存在,并将很快引入生产版本本身,因此我认为此错误不值得进一步注意。在VS2017更新3上编译,但在(RTM)更新2上编译。@Ajay奇怪,我的VS2017版本似乎是最新的,更新日期为5月30日,所以实际上是3天前。也许重要的是它是否是社区版(我的是社区版)?我也注意到了开发人员在这里遇到的问题:我还确认了这不仅仅发生在我自己的机器上。我已经安装了更新3的预览版,它有许多C++17功能。@Ajay哇,不知道预览!我马上就去试试。
void f(A<int>& a) {
a.call();
}