如在http://en.cppreference.com/w/cpp/memory/pointer_traits和相关网站上看到的(也是通过助推器实施的助推器),pointer_traits
不是专用于T*const
。这是为什么?为什么pointer_traits没有为“T * const”定义?
回答
虽然这不符合作为一个强大的动力对指定的pointer_traits<>
为T* const
专业化应该存在,我想为什么它没有被列入可能是pointer_traits<>
主要是指在一个范围内,其中使用说明模板论证扣除(并且特别是类型扣除)发生。
因为类型推导忽略顶级CV-资格,为T* const
或T* volatile
或T* const volatile
可能被认为是不必要的专业化:
#include <type_traits>
template<typename T>
void foo(T)
{
static_assert(std::is_same<T, int*>::value, "Error"); // Does not fire!
// ^^^^
}
int main()
{
int x = 0;
int* const p = &x;
foo(p);
}
当然,这并不意味着具有T* cv
专业化会受到伤害这种情况下,我只是想提供一个可能的解释,说明为什么这些专业化失踪。
同样,iterator_traits<>
没有专门提供T* cv
。
我有一个'foo(T&)'类型的函数模板,它会触发:( – 2013-03-13 14:27:58
@Johannes:是的,这是一个不会忽略顶级cv限定符的情况。只是为了澄清,我只是试图给出一个可能解释为什么专业化不存在;我不主张它*不应该在那里(实际上,实现似乎为'shared_ptr <>'提供了它) – 2013-03-13 15:01:03
在'foo(T&)'限定符'T'不是顶级的,'&'是顶级的,任何cv-qualifier都是“一级的” – 2013-03-13 16:17:27
- 1. 为什么const有意义?
- 2. 为什么要使用const T&而不是const T或T&
- 3. T&和T * const有什么区别?
- 4. 为什么我没有'ExecuteScalar'的定义?
- 5. 为什么没有定义函数javascript
- 6. 为什么我对response.name没有定义?
- 7. 为什么没有定义对象?
- 8. 为什么arg没有定义?
- 9. 为什么getAttribute没有定义?
- 10. 为什么没有定义cordova?
- 11. 什么为T
- 12. 为什么C#没有为变量和方法设计'const'?
- 13. 为什么jsonschema没有从模式定义下面的定义?
- 14. 为什么没有ArrayList(T [] t)构造函数?
- 15. 为什么std :: hash没有在C++ 0x中为std :: weak_ptr定义?
- 16. 为什么Big O在这里没有为散列表定义?
- 17. 为什么没有为命名指针类型定义方法?
- 18. 为什么Process0没有被定义为过程[ID,O]
- 19. 为什么T没有演绎为int &&这里
- 20. 为什么没有排序为IList <T>?!?! (编辑)
- 21. 为什么MediaPlayer.seekTo(t)没有达到确切的指定时刻“t”?
- 22. 为什么const int比const int&更快?
- 23. 为什么Scala的Option [T]没有直接转换为字节码中的T?
- 24. 为什么没有NSHTTPURLProtocol类?
- 25. 为什么全局定义“const Date default_date(1970,1,1);”坏?
- 26. 为什么const在静态函数中是未定义的?
- 27. 类型T没有定义
- 28. pointer_traits为既不是X <A, T...>也不提供成员typedef element_type的类型提供了什么?
- 29. 为什么gettimeofday()和time_t没有意义?
- 30. 为什么没有const void *的std :: free重载?
我会说,因为它适用于你存储指针的变量,而不是逻辑指针实体本身。指针的属性/特征如何存储并不重要。 – PlasmaHH 2013-03-13 12:42:46