
不幸的是,出于向后兼容性的原因,C 03,GCC自4.7以来只给出了这些警告.
GCC的documentation表明此扩展不适用于SFINAE环境,但似乎是错误的:
#include <type_traits>#include <utility>template <typename From,typename To>class is_List_convertible_helper{ template <typename To2> static voID requires_conversion(To2 t); template <typename From2,typename To2,typename = decltype(requires_conversion<To2>({std::declval<From2>()}))> // ^ Braced initializer static std::true_type helper(int); template <typename From2,typename To2> static std::false_type helper(...);public: using type = decltype(helper<From,To>(0));};template <typename From,typename To>class is_List_convertible : public is_List_convertible_helper<From,To>::type{ };static_assert(!is_List_convertible<double,int>::value,"double -> int is narrowing!"); GCC 4.9.1给出了这个输出
$g++ -std=c++11 foo.cppfoo.cpp: In substitution of ‘template<class From2,class To2,class> static std::true_type is_List_convertible_helper<From,To>::helper(int) [with From2 = double; To2 = int; <template-parameter-1-3> = <missing>]’:foo.cpp:18:31: @R_403_4173@ from ‘class is_List_convertible_helper<double,int>’foo.cpp:22:7: @R_403_4173@ from ‘class is_List_convertible<double,int>’foo.cpp:26:48: @R_403_4173@ from herefoo.cpp:10:46: warning: narrowing conversion of ‘std::declval<double>()’ from ‘double’ to ‘int’ insIDe { } [-Wnarrowing] typename = decltype(requires_conversion<To2>({std::declval<From2>()}))> ^foo.cpp:26:1: error: static assertion Failed: double -> int is narrowing! static_assert(!is_List_convertible<double,^ 如果没有为每个缩小转换添加特化,有没有办法让这个工作?
解决方法 很简单,这是海湾合作委员会的 bug.该错误已经存在,因为-std = c 11已被支持(尽管它在GCC 4.6中使用-std = c 0x).它已经为即将发布的GCC 5版本修复,但可能不会被移植到GCC 4.9. 总结以上是内存溢出为你收集整理的c – 如何通过非缩小转换来编写类型特征以检查类型是否可以转换为另一种类型?全部内容,希望文章能够帮你解决c – 如何通过非缩小转换来编写类型特征以检查类型是否可以转换为另一种类型?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)