>混沌 In C++ 一::是类型?还是函数调用? - y0 t! z- X9 T, h# w8 N
>& f: n+ a! H7 R: \
>struct A</P>9 Z2 E* w5 C& [. S1 D3 k1 Q
>{</P>9 }! i2 o) u, |3 b3 R7 K( ]
> A(){}</P>
>};</P>- b: c7 E; o7 B9 s8 v% m0 h
>template<typename T></P>0 L8 l& k4 A& [, b9 n( h \
>void func(T() )</P>: Q( b8 y7 z) W1 L1 E
>{}</P> |, G0 X! o- M. [
>int main()</P>
>{</P>
> A a( A() ); <a>file://(</A>1), OK</P>
> func( A() ); <a>file://(</A>2), Wrong</P>
> a = 5; <a>file://(</A>3), Wrong</P>
>}</P>' r h3 G6 J" P8 | O
>(1)、 A a( A() ); 是什么意思?</P>* N8 U4 s( U3 R- N/ t0 \
>在这里并不是用A()创建一个对象,然后实例化对象a。这里真正的语义是a是一个参数为返回A对象的无参函数指针的函数,所以它的真面目应</P>& u* F5 r' S) W# W0 X) _- O
>该是A a( A (*)() ) 。而这句仅仅起到声明函数的作用。重点就在于A()并不是创建对象,而是一个无参的、返回为A的无名函数</P>- r u% b( X: `" w6 D, e+ h
>为什么说A() 是一个无名的函数呢? 来类比一下</P>6 a$ Q% E9 W4 s2 u
>一个普通函数应该这样写 A fun()</P>: b/ k' \7 O+ c9 {- s/ W
>现在它是无名的,那么把fun去掉 就成了A()</P>. H2 O2 u }/ S
>(2)、 func( A() ); 为什么会出错呢?</P>
>这里虽然函数模板func的参数同样也是一个无参的、返回为T的函数指针,那为什么会出错呢? 其实在这里A()就不是一个无名函数了,而是创</P>
>建一个临时对象。那么这个函数即成了 void func( A ),而原本的类型是void func( T (*)() ),很明显参数类型不匹配。</P>9 y: l- i$ G2 \; ?5 }: m# u
>(3)、 a = 5; 现在应该没有任何疑问了</P>* W+ m2 A" S$ q3 v7 G$ }* f1 K+ I9 R
>把int 传递给 A (*)( A (*)() ),地球人都知道是错的。</P>, \4 q5 @! j. e1 @' P! f- m
>千万别走火入魔!</P>+ M7 i* p Y b+ Z" f- R; H
>是什么导致了(1)和(2)中的A()表现出不同的语义呢?</P>" R# j9 N7 S |3 S$ b
>答: 注意(1)是声明,当A()这个具有二意性东西出现在声明或定义中,那么它都被看作是“类型”而不是函数调用。所以这样一来,(2)明显</P>: j$ r% ~9 Q7 V) u* A' H
>不是定义,所以A()就被解析成调用。 </P>( u! X. L" T" s. g| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |