如在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