2012年(158)
分类: C/C++
2012-11-23 16:07:40
题目:对于 数组 和 指针 分别调用不同的实现。
想当然的写成
template
void foo( const T
(&pConstRef)[N] )
{
cout << 1 << endl;
}
template
void foo( const T* pConstRef )
{
cout
<< 2 <<
endl;
}
在g++3.4.2下正确,但在vc++8.0下有一个错误,它认为如果是数组的话,两者都适合。
于是我考虑到“数组地址不可修改”这一特性,把第二个函数改为
template
void foo( const
T* (&pConstRef) )
{
cout << 2 <<
endl;
}
但又出问题了,因为char *不可以转化为const char *的引用,想想也是,曾经在http://blog.vckbase.com/bruceteen/archive/2005/12/07/15691.html讨论过
char
buf[3];
char* p1 = buf;
//const char* p2 = p1;
//const char*
(&p3) = p2;
const char* (&p3) = p1; // 如果这句是合法的
p3 =
"abc";
*p1 = 'a'; // 那么将在这里见到上帝
于是改为(注:以下代码只是事例,如果要写得好,应该再包一层,以避免在foo中修改pConstRef本身)
#include
template
void foo( const T (&pConstRef)[N]
)
{
std::cout << 1 << std::endl;
}
template
void foo( const T* (&pConstRef) )
{
std::cout << 2 << std::endl;
}
template
void foo( T* (&pConstRef) )
{
const
T* t = pConstRef;
foo( t );
}
int main( )
{
const char a[] = "a";
const char* b =
"b";
char c[] = "a";
char* d = c;
foo( a );
foo( b );
foo( c );
foo( d );
return 0;
}
看起来有些复杂,我记得以前也写过,没这么复杂呀