Chinaunix首页 | 论坛 | 博客
  • 博客访问: 925994
  • 博文数量: 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;
}
看起来有些复杂,我记得以前也写过,没这么复杂呀

 

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

网友评论2012-11-23 16:09:07

周星星
template<typename T>
void foo( T const * const & )
{
}

int main( )
{
    const char a[] = "a";
    char const * const &p = a;
    foo( a ); // 对于模板就没能推演出来

    return 0;
}

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

100000
“形参是一个可以修改的引用,而数组地址不可修改”
这么说
template<class T >  
void foo( const T* const (&pConstRef) ) //变成常引用
{  
    cout << 2 << endl;  
}也应该可以接收数组了呀, 可为什么foo(a)还不行呢?

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

100000
"在g++3.4.2下正确,但在vc++8.0下有一个警告,它认为如果是数组的话,两者都适合。"  
喔,想了想错怪MS了,C++标准只是保证了指针不会进到第一个函数中去而数组可以。这一点MS做到了。不能说它不合标准。

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

周星星
形参是一个可以修改的引用,而数组地址不可修改,所以如果实参是数组,必然不能匹配。

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

100000
为什么由“数组地址不可修改”就联想到了:
template<class T >
void foo( const T* (&pConstRef) )
{
    cout << 2 << endl;
}呢?
能解释一下吗? 多谢!!