推导类型
Deducing the types
我在阅读 Scott Meyer 的 Effective Modern C++ 时试图理解类型推导。
考虑下面的代码片段:
template<typename T>
void f(const T& param); // param is now a ref-to-const; paramType is const T&
int x = 27; // as before
const int cx = x; // as before
const int& rx = x; // as before
f(x); // T is int, param's type is const int&
f(cx); // T is int, param's type is const int&
f(rx); // T is int, param's type is const int&
他说由于paramType
是一个引用,我们可以按照两步程序推导出T
的类型:
- 忽略
expr
中的引用(如果有)(即 x
、cx
和 rx
)
- 模式匹配
expr
和 paramType
的类型
现在 cx
是 const int
:
cx -> const int
paramType -> reference to const int
那么,根据提到的逻辑,由于模式匹配(而不仅仅是 int
),T
不应该是 const int
吗?我知道 cx
的 const
ness 已经传递给 paramType
,但是他说的是错的吗?他提到的这个两步程序是否不能作为经验法则遵循?你是怎么做到的?
谢谢!
当cx
为const int
时,则T
推导为int
,使const T& param
为const int& param
,即param
的类型是 const int&
.
在 his book 斯科特使用这个 "notation":
template<typename T>
void f(ParamType param); // where `ParamType` depends on T
所以当 param
是 const int
时,让我们为 ParamType
做模式匹配。我们有:
const T & <----> const int // <----> is symbolic notation for pattern matching
所以T
推导为int
,因此ParamType
是const int&
。
我在阅读 Scott Meyer 的 Effective Modern C++ 时试图理解类型推导。
考虑下面的代码片段:
template<typename T>
void f(const T& param); // param is now a ref-to-const; paramType is const T&
int x = 27; // as before
const int cx = x; // as before
const int& rx = x; // as before
f(x); // T is int, param's type is const int&
f(cx); // T is int, param's type is const int&
f(rx); // T is int, param's type is const int&
他说由于paramType
是一个引用,我们可以按照两步程序推导出T
的类型:
- 忽略
expr
中的引用(如果有)(即x
、cx
和rx
) - 模式匹配
expr
和paramType
的类型
现在 cx
是 const int
:
cx -> const int
paramType -> reference to const int
那么,根据提到的逻辑,由于模式匹配(而不仅仅是 int
),T
不应该是 const int
吗?我知道 cx
的 const
ness 已经传递给 paramType
,但是他说的是错的吗?他提到的这个两步程序是否不能作为经验法则遵循?你是怎么做到的?
谢谢!
当cx
为const int
时,则T
推导为int
,使const T& param
为const int& param
,即param
的类型是 const int&
.
在 his book 斯科特使用这个 "notation":
template<typename T>
void f(ParamType param); // where `ParamType` depends on T
所以当 param
是 const int
时,让我们为 ParamType
做模式匹配。我们有:
const T & <----> const int // <----> is symbolic notation for pattern matching
所以T
推导为int
,因此ParamType
是const int&
。