2013-03-09 94 views
5

std::is_signed<T>std::numeric_limits<T>::is_signed都应该给出关于T的签名的答案。
为什么现在有两个签名指示符(即从C++ 11开始)?std :: is_signed之间的区别<T>和std :: numeric_limits <T> :: is_signed?

+4

'std :: is_signed '是一种类型,而'std :: numeric_limits :: is_signed'成员只是一个值。在元编程中,让前者更方便,也更一致。 – Xeo 2013-03-09 00:36:04

+1

那么你实际上使用'std :: is_signed :: value'。你会直接在哪里使用'std :: is_signed '? – 2013-03-09 00:37:14

+0

但是他们的结果是否有所不同? – smilingthax 2013-03-09 00:38:29

回答

7

我会冒险猜测唯一的区别是如果std::numeric_limits<T>专门为用户定义的类型。这种用户定义类型当然可以为is_signed提供自己的值。但要求这种类型的std::is_signed<T>::value将始终返回false除非std::is_signed<T>已被独立专门化。

它好像是std::is_signed<T>代表的条件是

is_arithmetic<T>::value && T(-1) < T(0) 

更新:永远在线见地霍华德Hinnant(欣南特)points out,虽然std::numeric_limits<>可以合法,专业,没有什么<type_traits>被允许除非另有规定,否则专门化,并且is_signed未被指定为可专门化。

因此,std::numeric_limits<T>::is_signed可能为用户定义类型的返回true(如果它被专业),但std::is_signed<T>::value将始终为用户定义类型返回false

+0

您可以专注于' std :: numeric_limits '为用户定义的类型?在C++ 03中,用户向命名空间“std”添加任何内容都是非法的。 C++ 11已经解除了这个限制吗? – 2013-03-09 01:01:29

+0

@DavidHammen:不,限制在那里,但不适用于专业化。你可以在'std'中专门化现有的模板,你不能添加你自己的东西。 – 2013-03-09 01:04:45

+0

@DavidHammen:在命名空间'std'中完全专门化模板总是合法的,只是不能部分专门化类模板或重载函数/函数模板。 – ildjarn 2013-03-09 01:04:57

相关问题