如何在不实际制作新配对的情况下将person.name_ = new_name;
转换为std::pair<const string,int>
?
我尝试使用static_cast如下:
std::pair<string,int>
curr-&gt; valPair - 正在返回static_cast<std::pair<const string, int>>(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>
]
EDIT2:
添加一小段代码以重现问题
std::pair<const string,int>
我在编译时遇到错误:
#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;
}
答案 0 :(得分:4)
只有在转换后不再需要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的回答。
答案 1 :(得分:0)
即使^[a-z]{3}([_.-])[0-9]{3}\1[0-9]{3}\1[0-9]{3}
可隐式转换为std::string
,但这两种类型是不同的。
您要做的是const std::string
到reinterpret_cast
。
执行std::pair<const std::string, int>&
意味着您可以完全绕过类型系统来抑制几乎所有编译器诊断。在这种情况下,它可能是相当温和的,但一般来说,你更清楚地知道你在做什么。
答案 2 :(得分:0)
我想我得到了你想要的东西。您有一个pair<T, U>
(非const)的类成员,但希望该类的用户引用该成员,但也希望禁止用户修改第一个项目。我是对的吗?
您可以使用具有不同const限定符的一对引用({{1}),而不是引用具有不同const限定符的对,用于模板参数(pair<const T, U>&
中的pair<T, U>
)。而不是pair<const T&, U&>
)。
构造一对引用比复制成员便宜得多。如果您希望用户修改原始实例上的第二个参数,那么副本可能没有意义。
构建参考对:
pair<const T, U>&