std::pair 中的 Const 转换
Const Conversion in std::pair
如何在不实际制作新配对的情况下将 std::pair<const string,int>
转换为 std::pair<string,int>
?
我尝试使用 static_cast 如下:
static_cast<std::pair<const string, int>>(curr->valPair)
curr->valPair - 正在返回 std::pair<string,int>
但返回错误:
invalid initialization of non-const reference of type ‘std::pair<const std::basic_string<char>, int>&’ from an rvalue of type ‘std::pair<const std::basic_string<char>, int>’
[编辑:简而言之,问题是如何将 std::pair<string,int>
转换为 std::pair<const string,int>
]
编辑2:
添加一小段代码来重现问题
#include<iostream>
using namespace std;
class A
{
std::pair<int,int> valPair;
public:
std::pair<const int,int> & getPairByReference();
};
std::pair<const int,int> & A::getPairByReference()
{
return valPair;
}
int main()
{
A a;
a.getPairByReference();
return 0;
}
编译时出现以下错误:
try-5.cpp: In member function ‘std::pair<const int, int>& A::getPairByReference()’:
try-5.cpp:15:12: error: invalid initialization of reference of type ‘std::pair<const int, int>&’ from expression of type ‘std::pair<int, int>’
只有在转换后不再需要 curr->valPair
时,您尝试执行的操作才有可能,然后
std::pair<const string, int> newPair(std::move(curr->valPair));
通过移动构造将 std::pair<string, int>
移动到 std::pair<const string, int>
。
如果必须保留 curr->valPair
的值,则无法执行此操作,因为类型转换需要构造目标类型的实例。只能通过移动来避免复制字符串。
但是您可能想要进行此转换,因为您需要在某处使用 const string
的特定目标类型。如果能说明用途就更好了。问题可能出在这里。
问题编辑后:
您不能将 std::pair<const int, int>&
类型的引用指向 std::pair<int, int>
类型的对象。这是两种完全独立的类型。您需要先构造一个 std::pair<const int, int>
类型的对象,然后才能引用这种类型。
补充说明:
reinterpret_cast
在这里可能有效(并且会导致我上面的陈述出现异常),我不确定,here is a discussion on the topic。请参阅@StoryTeller 的回答。
尽管 std::string
可以隐式转换为 const std::string
,但这两种对类型是不同的。
您要做的是 reinterpret_cast
到 std::pair<const std::string, int>&
。
reinterpret_cast
意味着您通过完全绕过类型系统来抑制几乎所有的编译器诊断。在这种情况下,它可能是相当良性的,但总的来说,你最好清楚自己在做什么。
我想我得到了你想要的。您有一个 class 成员,它是 pair<T, U>
(非常量),但希望 class 的用户引用该成员,但也希望禁止用户修改第一个物品。我说的对吗?
与其引用一对具有不同常量限定符的模板参数(pair<const T, U>&
来自 pair<T, U>
),不如使用一对具有不同常量限定符的引用(pair<const T&, U&>
而不是 pair<const T, U>&
).
构造一对引用比复制成员便宜得多。如果您确实希望用户修改原始实例上的第二个参数,则副本可能没有意义。
构建引用对:
std::pair<const string&, int&> A::getPairByReference()
{
return {valPair.first, valPair.second};
}
如何在不实际制作新配对的情况下将 std::pair<const string,int>
转换为 std::pair<string,int>
?
我尝试使用 static_cast 如下:
static_cast<std::pair<const string, int>>(curr->valPair)
curr->valPair - 正在返回 std::pair<string,int>
但返回错误:
invalid initialization of non-const reference of type ‘std::pair<const std::basic_string<char>, int>&’ from an rvalue of type ‘std::pair<const std::basic_string<char>, int>’
[编辑:简而言之,问题是如何将 std::pair<string,int>
转换为 std::pair<const string,int>
]
编辑2:
添加一小段代码来重现问题
#include<iostream>
using namespace std;
class A
{
std::pair<int,int> valPair;
public:
std::pair<const int,int> & getPairByReference();
};
std::pair<const int,int> & A::getPairByReference()
{
return valPair;
}
int main()
{
A a;
a.getPairByReference();
return 0;
}
编译时出现以下错误:
try-5.cpp: In member function ‘std::pair<const int, int>& A::getPairByReference()’:
try-5.cpp:15:12: error: invalid initialization of reference of type ‘std::pair<const int, int>&’ from expression of type ‘std::pair<int, int>’
只有在转换后不再需要 curr->valPair
时,您尝试执行的操作才有可能,然后
std::pair<const string, int> newPair(std::move(curr->valPair));
通过移动构造将 std::pair<string, int>
移动到 std::pair<const string, int>
。
如果必须保留 curr->valPair
的值,则无法执行此操作,因为类型转换需要构造目标类型的实例。只能通过移动来避免复制字符串。
但是您可能想要进行此转换,因为您需要在某处使用 const string
的特定目标类型。如果能说明用途就更好了。问题可能出在这里。
问题编辑后:
您不能将 std::pair<const int, int>&
类型的引用指向 std::pair<int, int>
类型的对象。这是两种完全独立的类型。您需要先构造一个 std::pair<const int, int>
类型的对象,然后才能引用这种类型。
补充说明:
reinterpret_cast
在这里可能有效(并且会导致我上面的陈述出现异常),我不确定,here is a discussion on the topic。请参阅@StoryTeller 的回答。
尽管 std::string
可以隐式转换为 const std::string
,但这两种对类型是不同的。
您要做的是 reinterpret_cast
到 std::pair<const std::string, int>&
。
reinterpret_cast
意味着您通过完全绕过类型系统来抑制几乎所有的编译器诊断。在这种情况下,它可能是相当良性的,但总的来说,你最好清楚自己在做什么。
我想我得到了你想要的。您有一个 class 成员,它是 pair<T, U>
(非常量),但希望 class 的用户引用该成员,但也希望禁止用户修改第一个物品。我说的对吗?
与其引用一对具有不同常量限定符的模板参数(pair<const T, U>&
来自 pair<T, U>
),不如使用一对具有不同常量限定符的引用(pair<const T&, U&>
而不是 pair<const T, U>&
).
构造一对引用比复制成员便宜得多。如果您确实希望用户修改原始实例上的第二个参数,则副本可能没有意义。
构建引用对:
std::pair<const string&, int&> A::getPairByReference()
{
return {valPair.first, valPair.second};
}