Skip to content

Commit 4d19a64

Browse files
authored
Merge pull request wuye9036#32 from vczf/master
修复文字错误
2 parents 330c0b3 + fd1c8f1 commit 4d19a64

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

ReadMe.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -452,12 +452,12 @@ float i = c_style_cast<int, float>(v);
452452

453453
嗯,很顺利的通过了。难道C++不能支持让参数推导一部分模板参数吗?
454454

455-
当然是可以的。只不过在部分推导、部分指定的情况下,编译器对模版参数的顺序是有限制的:先写需要指定的模板参数,再把能推导出来的模板参数放在后面。
455+
当然是可以的。只不过在部分推导、部分指定的情况下,编译器对模板参数的顺序是有限制的:先写需要指定的模板参数,再把能推导出来的模板参数放在后面。
456456

457457
在这个例子中,能推导出来的是 `SrcT`,需要指定的是 `DstT`。把函数模板写成下面这样就可以了:
458458

459459
``` C++
460-
template <typename DstT, typename SrcT> DstT c_style_cast(SrcT v) // 模版参数 DstT 需要人肉指定,放前面。
460+
template <typename DstT, typename SrcT> DstT c_style_cast(SrcT v) // 模板参数 DstT 需要人肉指定,放前面。
461461
{
462462
return (DstT)(v);
463463
}
@@ -1370,7 +1370,7 @@ template <typename T> foo(T& v0, C& v1){
13701370
1. 函数`foo`中的变量`v1`已经确定是`struct C`的实例,所以,`v1.a = 2;`会导致编译错误,`v1.c = 3;`是正确的代码;
13711371
2. 对于变量`v0`来说,这个问题就变得很微妙。如果`v0`是`struct A`或者`struct AB`的实例,那么`foo`中的语句`v0.a = 1;`就是正确的。如果是`struct C`,那么这段代码就是错误的。
13721372
1373-
因此在模板定义的地方进行语义分析,并不能**完全**得出代码是正确或者错误的结论,只有到了实例化阶段,确定了模版参数的类型后,才知道这段代码正确与否。令人高兴的是,在这一问题上,我们和C++标准委员会的见地一致,说明我们的C++水平已经和Herb Sutter不分伯仲了。既然我们和Herb Sutter水平差不多,那凭什么人家就吃香喝辣?下面我们来选几条标准看看服不服:
1373+
因此在模板定义的地方进行语义分析,并不能**完全**得出代码是正确或者错误的结论,只有到了实例化阶段,确定了模板参数的类型后,才知道这段代码正确与否。令人高兴的是,在这一问题上,我们和C++标准委员会的见地一致,说明我们的C++水平已经和Herb Sutter不分伯仲了。既然我们和Herb Sutter水平差不多,那凭什么人家就吃香喝辣?下面我们来选几条标准看看服不服:
13741374
13751375
> **14.6 名称解析(Name resolution)**
13761376

0 commit comments

Comments
 (0)