如果你知道模板类型推导你几乎可以知道全部有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