make_pair(1, "Test")有错吗?

lifanxi 2003-12-23 10:46:21
其实问题就是make_pair函数模版的两个形参应该传引用还是传值的问题。
make_pair(1, "Test")在VC6中不能通过,除非改成make_pair<int, const char *>(1, "Test")或者make_pair(1, (const char *)"Test")。但它可以在VC7和Dev C++下通过。究其原因,VC6中它的两个形参是传引用的,而VC7是传值,Dev C++默认是传值,除非改一个#define值。Dev中的注释是这样写的:
The standard requires that the objects be passed by reference-to-const,
but LWG issue #181 says they should be passed by const value. We follow
the LWG by default.
查了一下ISO14882,确实是要传引用的。
LWG是指什么?我猜猜是不是Library Writer's Guide?哪里可以找到?
这个问题本身没有什么太大的意思,不过我很希望能听听大家对这个问题的看法。
...全文
281 4 打赏 收藏 举报
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
pig1210127 2003-12-24
gz
  • 打赏
  • 举报
回复
xueweizhong 2003-12-24
关于make_pair(1, "Test")为什么有错:

1 先声明一些东西:
template <typename T1, typename T2>
struct pair
{
T1 first;
T2 second;
// ...
};

template <typename T1, typename T2>
pair<T1, T2> make_pair(T1 const&, T2 const&);

2 当调用make_pair(1, "Test")时

2.1 类型推导
#1 T1 = int;
#2 由于"Test"的类型是char const[5],
而且函数参数T2 const&是引用,
所以T2 = char const[5]
2.2 实例化函数
pair<int, char const[5]> make_pair<>(int const&, char const (const&)[5]);

3 实例化pair<int, char const[5]>类型导致:

struct pair<>
{
int first;
char const second[5];
//...
};
这个类型根本就不可能用来生成对象,因为你
无法初始化常数数组成员。

4 实例化失败导致编译错误:
template <typename T1, typename T2>
pair<T1, T2> make_pair(T1 const& t1, T2 const& t2)
{
return pair<T1, T2>(t1, t2); // 无法构造pair对象,见上面3的描述
^^^^^^^^^^^^^^^^^^^^^
}
  • 打赏
  • 举报
回复
lifanxi 2003-12-24
感谢xueweizhong!尤其是提供的网址很有价值!


  • 打赏
  • 举报
回复
xueweizhong 2003-12-23
Library work group
相对应的是CWG
core work group

是指C++标准化委员会的“库工作组”。
你可以在
http://anubis.dkuug.dk/jtc1/sc22/wg21/
上找到相关内容。

改成值方式的原因是:
在原有方式下(传递引用):
make_pair("str1", "str22"); 是非法的,太不符合直观。

  • 打赏
  • 举报
回复
发帖
工具平台和程序库
加入

2.4w+

社区成员

C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
申请成为版主
帖子事件
创建了帖子
2003-12-23 10:46
社区公告
暂无公告