在VS 2015周期中,我们一直专注于我们的expression SFINAE实现的质量。因为表达式问题可能是微妙而复杂的,所以我们一直在使用流行的库,例如 促进 和 微软的分支范围-v3 以验证我们的实现并找到剩余的bug。当我们将编译器团队的注意力转移到Visual Studio 2017版本时,我们很高兴告诉您我们在正确解析表达式SFINAE方面所做的改进。
null
在整个Visual Studio 2015和2017周期中,我们一直在跟踪对表达式SFINAE解析的更改和改进。VS 2017 RC增加的改进(自VS 2015更新3)如下所示。我们还更新了 原始博客文章 通过我们最近的改进,您可以在一个地方跟踪我们的所有进展。
自Visual Studio 2015 Update 3以来的改进
现在,我们正确地编译了像Range-v3那样构造临时对象的代码:
#include <type_traits> template<typename T, std::enable_if_t<std::is_integral<T>{}> * = nullptr> char f(T *); template<typename T> short f(...); int main() { static_assert(sizeof(f<int>(nullptr)) == sizeof(char), "fail"); static_assert(sizeof(f<int *>(nullptr)) == sizeof(short), "fail"); }
我们还改进了SFINAE的访问检查,如下面的代码示例所示:
template <typename T> class S { private: typedef T type; }; template <typename T> class S<T *> { public: typedef T type; }; template <typename T, typename S<T>::type * = nullptr> char f(T); template<typename T> short f(...); int main() { static_assert(sizeof(f<int>(0)) == 2, "fail"); // fails in VS2015 static_assert(sizeof(f<int *>(nullptr)) == 1, "fail"); }
最后,我们改进了对 void_t
在Boost Hana中的typename中使用时:
template<typename T, typename U> struct std_common_type {}; template<typename T> struct std_common_type<T, T> { using type = T; }; template<typename T, typename U> struct is_same { static const bool value = false; }; template<typename T> struct is_same<T, T> { static const bool value = true; }; template<bool, typename T> struct enable_if {}; template<typename T> struct enable_if<true, T> { using type = T; }; template<typename...> using void_t = void; template <typename T, typename U = T, typename = void> struct EqualityComparable1 { static const bool value = false; }; template <typename T, typename U> struct EqualityComparable1<T, U, typename enable_if<!is_same<T, U>::value, void_t<typename std_common_type<T, U>::type>>::type> { static const bool value = true; }; template <typename T, typename U = T, typename = void> struct EqualityComparable2 { static const bool value = false; }; template <typename T, typename U> struct EqualityComparable2<T, U, void_t<typename std_common_type<T, U>::type>> { static const bool value = true; }; void f() { struct S1 {}; struct S2 {}; static_assert(!EqualityComparable1<S1, S2>::value, "fail"); // fails in VS2015 static_assert(!EqualityComparable2<S1, S2>::value, "fail"); }
最后
一如既往,我们欢迎您的反馈。请在下面的评论中或通过电子邮件给我们关于expression SFINAE的反馈 visualcpp@microsoft.com .
如果您在VS 2017 RC中遇到VisualC++的其他问题,请通过报告从安装程序或VisualStudioIDE本身通知我们一个问题选项。如需建议,请告知我们 用户语音 . 谢谢您!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END