相关疑难解决方法(0)

什么能和不能专注于std命名空间?

允许用户向std命名空间添加显式特化.但是,有一些模板我明确禁止专业化.

我可以和不可以使用哪些模板?

c++ std explicit-specialization c++11

56
推荐指数
1
解决办法
3194
查看次数

为什么专门化type_trait会导致未定义的行为?

讨论

根据标准§20.10.2/ 1标题<type_traits>提要[meta.type.synop]:

1 除非另有说明,否则为本子条款中定义的任何类模板添加特殊化的程序的行为是未定义的.

这个特定的条款与STL应该是可扩展的一般概念相矛盾,并且阻止我们扩展类型特征,如下例所示:

namespace std {
template< class T >
struct is_floating_point<std::complex<T>> : std::integral_constant
         <
         bool,
         std::is_same<float, typename std::remove_cv<T>::type>::value  ||
         std::is_same<double, typename std::remove_cv<T>::type>::value ||
         std::is_same<long double, typename std::remove_cv<T>::type>::value
         > {};
}
Run Code Online (Sandbox Code Playgroud)

LIVE DEMO

其中std::is_floating_point扩展为处理complex具有基础浮点类型的数字.

问题

  1. 是什么原因使标准化委员会决定类型特征不应该是专业化的.
  2. 是否有任何未来的计划可以撤回此限制.

c++ undefined-behavior language-lawyer c++11 c++14

6
推荐指数
1
解决办法
363
查看次数