Chinaunix首页 | 论坛 | 博客
  • 博客访问: 934611
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

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;
}
看起来有些复杂,我记得以前也写过,没这么复杂呀

 

阅读(1572) | 评论(6) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-23 16:08:23

100000
"在g++3.4.2下正确,但在vc++8.0下有一个警告,它认为如果是数组的话,两者都适合。"
这一点g++是正确的,VC8不符合标准而已。
C++标准好像说过,大概意思是:在模板参数的推演过程中如果形参是数组的引用,这时不会发生数组到指针的decay。