【发布时间】:2014-10-10 07:33:06
【问题描述】:
讨论
根据标准§20.10.2/1 Header <type_traits> synopsis [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
> {};
}
其中std::is_floating_point 被扩展为处理complex 具有底层浮点类型的数字。
问题
- 是什么原因使标准化委员会决定不应专门化类型特征。
- 未来是否有取消此限制的计划。
【问题讨论】:
-
@billz 怎么样?该程序发布了展品 UB。
-
为什么不
struct is_floating_point<std::complex<T>> : public std::is_floating::point<T> {};? -
@Manu343726 是的排序更好,但也无关紧要,因为您的版本也表现出未定义的行为。
-
即使它被允许,特化
std::is_floating_point并使您的整个翻译单元将std::complex视为浮点类型,这样您就可以检查“是std::complex还是浮点数“在你的一个功能中,就像炸毁你的房子来呼吸新鲜空气一样。类型特征类查询类型的基本属性,是模板元程序的基本构建块。允许你为他们添加专业化是没有意义的。
标签: c++ c++11 language-lawyer undefined-behavior c++14