引用类型可以用作 STL 映射中的键类型吗

发布于 2024-08-12 01:03:21 字数 87 浏览 4 评论 0原文

我可以构造一个 std::map ,其中键类型是引用类型,例如 Foo & ,如果不能,为什么不呢?

Can I construct an std::map where the key type is a reference type, e.g. Foo & and if not, why not?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

非要怀念 2024-08-19 01:03:21

根据 C++ 标准 23.1.2/7 key_type 应该是可分配的。引用类型不是。

According to C++ Standard 23.1.2/7 key_type should be assignable. Reference type is not.

倾城月光淡如水﹏ 2024-08-19 01:03:21

不可以,因为 std::map 中的许多函数都需要对键类型的引用,而对引用的引用在 C++ 中是非法的。

/AB

No, because many of the functions in std::map takes a reference to the keytype and references to references are illegal in C++.

/A.B.

骑趴 2024-08-19 01:03:21

考虑operator[](const key_type & key)
如果 key_typeFoo & 那么 const key_type & 是什么?
问题是它不起作用。您无法构造键类型为引用类型的 std::map。

Consider the operator[](const key_type & key).
If key_type is Foo & then what is const key_type &?
The thing is that it does not work. You can not construct an std::map where the key type is a reference type.

卷耳 2024-08-19 01:03:21

指针作为 std::map 的键类型是完全合法的

#include <iostream>
#include <cstdlib>
#include <map>

using namespace std;


int main()
{
int a = 2;
int b = 3;
int * c =  &a;
int * d =  &b;
map<int *, int> M;

M[c]=356;
M[d]=78;
return 0;
}

初始化引用不能是键:

#include <iostream>
#include <cstdlib>
#include <map>

using namespace std;


int main()
{
int a = 2;
int b = 3;
int & c =  a;
int & d =  b;
map<int &, int> M;

M[c]=356;
M[d]=78;
return 0;
}
In file included from /usr/include/c++/4.4/map:60,
                 from test.cpp:3:
/usr/include/c++/4.4/bits/stl_tree.h: In instantiation of 'std::_Rb_tree<int&, std::pair<int&, int>, std::_Select1st<std::pair<int&, int> >, std::less<int&>, std::allocator<std::pair<int&, int> > >':
/usr/include/c++/4.4/bits/stl_map.h:128:   instantiated from 'std::map<int&, int, std::less<int&>, std::allocator<std::pair<int&, int> > >'
test.cpp:14:   instantiated from here
/usr/include/c++/4.4/bits/stl_tree.h:1407: error: forming pointer to reference type 'int&

'

Pointer as a key-type for std::map is perfectly legal

#include <iostream>
#include <cstdlib>
#include <map>

using namespace std;


int main()
{
int a = 2;
int b = 3;
int * c =  &a;
int * d =  &b;
map<int *, int> M;

M[c]=356;
M[d]=78;
return 0;
}

Initialised references cant be keys:

#include <iostream>
#include <cstdlib>
#include <map>

using namespace std;


int main()
{
int a = 2;
int b = 3;
int & c =  a;
int & d =  b;
map<int &, int> M;

M[c]=356;
M[d]=78;
return 0;
}
In file included from /usr/include/c++/4.4/map:60,
                 from test.cpp:3:
/usr/include/c++/4.4/bits/stl_tree.h: In instantiation of 'std::_Rb_tree<int&, std::pair<int&, int>, std::_Select1st<std::pair<int&, int> >, std::less<int&>, std::allocator<std::pair<int&, int> > >':
/usr/include/c++/4.4/bits/stl_map.h:128:   instantiated from 'std::map<int&, int, std::less<int&>, std::allocator<std::pair<int&, int> > >'
test.cpp:14:   instantiated from here
/usr/include/c++/4.4/bits/stl_tree.h:1407: error: forming pointer to reference type 'int&

'

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文