如果你知道模板類型推導你幾乎可以知道全部有auto
類型扣除。因爲自動類型扣除像模板類型扣除那樣工作。
當一個變量使用auto
聲明,那麼auto
充當T
在模板,和類型說明符充當參數類型:
const auto i = 20;
將轉化爲:
template<typename T>
void func(const T param) { ... }
// ^^^^^^^
並供參考:
const auto& j = i;
翻譯爲:
template<typename T>
void func(const T& param)
// ^^^^^^^^
的指針,這是相同的:
auto* v1 = &x;
變爲
template<typename T>
void func(T* param)
由於x
是int
,然後auto* == int*
。
而auto* v2 = px;
也int*
現在,您有第三個:
auto* v3 = &px;
變爲int**
因爲你以指針的地址。
template<typename T>
void func(T** param)
// ^^^
一種方便的方法,看汽車的類型是使用已經提到別人時,typeid()
功能。
但我喜歡用<boost/type_index.hpp>
正確顯示類型:
#include <iostream>
#include <boost/type_index.hpp>
using namespace std;
using namespace boost::typeindex;
int main()
{
int x = 64;
int* px = &x;
auto* v1 = &x;
auto* v2 = px;
auto* v3 = &px;
cout << type_id_with_cvr<decltype(v1)>().pretty_name() << '\n';
cout << type_id_with_cvr<decltype(v2)>().pretty_name() << '\n';
cout << type_id_with_cvr<decltype(v3)>().pretty_name() << '\n';
}
,輸出:
int*
int*
int**
有汽車類型推演和模板類型推演之間的一個重要差異,即std::initializer_list<>
考慮這些例子大小寫:
auto i = 1; // int
auto j(1); // int
auto k = { 1 }// std::initializer_list<int> !
auto l { 1 } // std::initializer_list<int> !
正如你所看到的,使用帶有auto的括號初始值設定可能會有問題。
但是,您可以手動編寫類型之前的牙套,以確保該類型是正確的,但我沒有看到的一點:
auto i = int{ 1 }; // type is int
有new auto rules已在Clang的3.8,使已實施它有可能使用直接列表初始化與自動(即將推出的標準)
據我所知,汽車的作品完全一樣的模板...我其實瞭解大多數類型的自動和模板扣除,但混淆我的位是(自動*),如果我會擴大我的問題,我會問(T *)從模板太:)不幸的是我沒有提升庫:(但+1 ...臨屋區你好 – Laith