我正在尝试创建一个将成员函数作为constexpr静态成员的类。事情在GCC和Clang上都很有效,但在MSVC 2015上,事情变得更加复杂。
这里是一个重现错误的代码:
template<typename T, T t>
struct Method {
using Type = T;
constexpr const static T method = t;
};
template<typename T, T t>
constexpr const T Method<T, t>::method;
struct Test1 {
void method1(int, double) {}
};
struct Test2 {
template<typename T, T t, typename... Params>
void method2(Params...) {}
template<typename T, T t>
void method3(int, double) {}
//using p1_t = Method<
// decltype(&Test2::method2<decltype(&Test1::method1), &Test1::method1, int, double>),
// &Test2::method2<decltype(&Test1::method1), &Test1::method1, int, double>
//>;
};
int main()
{
Method<
void (Test2::*)(int, double),
&Test2::method2<decltype(&Test1::method1), &Test1::method1, int, double>
> p1;
//Method<
// decltype(&Test2::method2<decltype(&Test1::method1), &Test1::method1, int, double>),
// &Test2::method2<decltype(&Test1::method1), &Test1::method1, int, double>
//> p2;
Method<
void (Test2::*)(int, double),
&Test2::method3<decltype(&Test1::method1), &Test1::method1>
> p3;
//Method<
// decltype(&Test2::method3<decltype(&Test1::method1), &Test1::method1>),
// &Test2::method3<decltype(&Test1::method1), &Test1::method1>
//> p4;
return 0;
}
取消注释p2
和p4
的声明会导致MSVC 2015出错。
但是在海湾合作委员会,一切都没问题,live on coliru
是否有可能在MSVC上做这样的事情以及解决方法是什么?