在VS 2017 RC中对Expression SFINAE的更新

在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
喜欢就支持一下吧,技术咨询可以联系QQ407933975
点赞0 分享