关于std::pair源代码一个小问题?

poor_coder 2007-10-28 10:08:18
部分源代码:
template <class _T1, class _T2>
struct pair {
typedef _T1 first_type;
typedef _T2 second_type;

_T1 first;
_T2 second;
// 构造函数
pair() : first(_T1()), second(_T2()) {}
pair(const _T1& __a, const _T2& __b) : first(__a), second(__b) {}
// 拷贝构造函数,支持隐式类型转换
template <class _U1, class _U2>
pair(const pair<_U1, _U2>& __p) : first(__p.first), second(__p.second) {} //隐式转换
pair(const pair<_T1,_T2>& __o) : first(__o.first), second(__o.second) {}
};
问题:如果模板类型参数_T2是char*类型,那么_T2就是char*类型,如是构造函数中的参数_b就应该是const char* 类型。为什么const char*类型指针可以直接赋值给char*指针?
...全文
373 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ryfdizuo 2007-10-28
  • 打赏
  • 举报
回复
同意楼上, const char*本来就可以赋给char*, 返过来是肯定不行的,
Mephisto_76 2007-10-28
  • 打赏
  • 举报
回复
有何不可的,所有的const char*值都可以赋给char*类型的变量的。

而且这边还不是赋值,这边是构造一个char*类型,其初始值是char*指定的一个值。
独孤过儿 2007-10-28
  • 打赏
  • 举报
回复
朋友,能简化一下你的代码吗?或者抽象一下能表示出问题就行
  • 打赏
  • 举报
回复
你用typeid输出一下类型看看
poor_coder 2007-10-28
  • 打赏
  • 举报
回复
char pBuf[10] = "Test";
char* pNonConst = pBuf;
const char* pConst = pBuf;

请大家判断下面语句的正确性,谢谢!
1: const char* &pRef = pNonConst;
2: const char* &pRef = pConst;

3: char* ptr = pRef ; (pRef是const char* & 类型)

我的问题是:我编译的语句1为错误的,但是为什么std::pair构造函数中second = _b能编译通过? second是char*类型, _b是const char* &类型
试图说清楚自己的问题,越来糊涂了,真抱歉!
poor_coder 2007-10-28
  • 打赏
  • 举报
回复
void TestFun(const char* & p)
{
}

调用:
char pBuf[10] = "Test";
char* pNonConst = pBuf;
const char* pConst = pBuf;

TestFun(pConst);
TestFun(pNonConst); // 会报错

能具体解释下什么原因吗?

为什么在std::pair的源代码中,构造函数pair(const _T1& __a, const _T2& __b) 能接受非const类型的指针?
poor_coder 2007-10-28
  • 打赏
  • 举报
回复
finytang的解释应该是正确的.
int a = 10;
int& b = a;
const int& c = a; // 这个是常量引用。此时c成为read_only,不光是c不能被改变,就算c被引用的值(a的值)也不能被改变。
如果仅是const int c = a,相信结果大家都知道是什么了。
谢谢各位。

知识点应该是 “常量引用”吧,也不知有这个说法没,我自己编的!
ilovevvv 2007-10-28
  • 打赏
  • 举报
回复
用typeid看了一下,不是const char*类型,是char*类型,至于为什么..没想明白:(

#include <typeinfo>

template<typename T, typename U>
class CTest
{
public:
CTest(const T &t, const U &u)
{
printf("t's typename = %s\nu's typename = %s\n", typeid(t).name(), typeid(u).name());
}
};

void main()
{
char *szTest[2] = {"1", "2"};
CTest<char*, char*> c(szTest[0], szTest[1]);
}


poor_coder 2007-10-28
  • 打赏
  • 举报
回复
不好意思,我的问题没有描述清楚。

例子:
char pBuf[10] = "Test" ;
std::pair<int, char*> p<10, pBuf>;

传入参数pbuf是char*类型,即_T2为char*类型。_T2又定义了成员变量second,所以second也是char*类型。
但是在其构造函数pair(const _T1& __a, const _T2& __b) : first(__a), second(__b) {} 中:
second(_b) ??? 此时_b不是const char*类型吗? const char*类型的指针不能赋值给char*类型指针的啊?
finytang 2007-10-28
  • 打赏
  • 举报
回复
const _T2& __b是指不能修改__b,用__b去初始化second并没有违反这个规定
Oversense 2007-10-28
  • 打赏
  • 举报
回复
类型是 _T2& 不是_T2

类型不是 char *

typdef char * pchar;

pchar&

64,439

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧