>混沌 In C++ 一::是类型?还是函数调用?
>5 s3 t2 w$ f9 [! h* h
>struct A</P> A% J9 z H5 v# G
>{</P>
> A(){}</P>6 y2 W* z% o2 N# {- _# |1 i9 H
>};</P>: e( G: z5 O) H6 G" Q1 N9 p
>template<typename T></P>9 I& t. r# o- S7 e6 L( @
>void func(T() )</P>7 @2 I6 |* J/ ]8 s+ n4 h
>{}</P>
>int main()</P>3 y9 B" O+ J3 T
>{</P>4 _/ u, q5 v) H0 o
> A a( A() ); <a>file://(</A>1), OK</P>( g& O- ~# h* c4 `6 a" e" A1 k; H
> func( A() ); <a>file://(</A>2), Wrong</P>
> a = 5; <a>file://(</A>3), Wrong</P>" |* M' s& k% E9 b; {
>}</P>
>(1)、 A a( A() ); 是什么意思?</P>
>在这里并不是用A()创建一个对象,然后实例化对象a。这里真正的语义是a是一个参数为返回A对象的无参函数指针的函数,所以它的真面目应</P>
>该是A a( A (*)() ) 。而这句仅仅起到声明函数的作用。重点就在于A()并不是创建对象,而是一个无参的、返回为A的无名函数</P>! R: g- K/ M2 M4 L* S3 K
>为什么说A() 是一个无名的函数呢? 来类比一下</P> {: W% F/ _/ G& a2 i
>一个普通函数应该这样写 A fun()</P>* R& ~( x7 i4 D- O2 j, E2 a
>现在它是无名的,那么把fun去掉 就成了A()</P>
>(2)、 func( A() ); 为什么会出错呢?</P>
>这里虽然函数模板func的参数同样也是一个无参的、返回为T的函数指针,那为什么会出错呢? 其实在这里A()就不是一个无名函数了,而是创</P># u1 x( {" X/ [* `! x0 o
>建一个临时对象。那么这个函数即成了 void func( A ),而原本的类型是void func( T (*)() ),很明显参数类型不匹配。</P>( A- `/ `7 t- A& v1 Q, t
>(3)、 a = 5; 现在应该没有任何疑问了</P>
>把int 传递给 A (*)( A (*)() ),地球人都知道是错的。</P>9 r- F5 e; B& | V2 b$ v
>千万别走火入魔!</P>. j9 X8 _% ~& ]8 r; c; q. B
>是什么导致了(1)和(2)中的A()表现出不同的语义呢?</P>' B/ t+ |: C. K0 k" V
>答: 注意(1)是声明,当A()这个具有二意性东西出现在声明或定义中,那么它都被看作是“类型”而不是函数调用。所以这样一来,(2)明显</P>
>不是定义,所以A()就被解析成调用。 </P>| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |