C++ std::pair中的常量转换
如何将C++ std::pair中的常量转换,c++,std-pair,C++,Std Pair,如何将std::pair转换为std::pair,而不实际创建新的一对 我尝试使用静态_cast,如下所示: static_cast<std::pair<const string, int>>(curr->valPair) static\u cast(curr->valPair) curr->valPair-正在返回std::pair 但它返回了一个错误: invalid initialization of non-const reference of type
std::pair
转换为std::pair
,而不实际创建新的一对
我尝试使用静态_cast,如下所示:
static_cast<std::pair<const string, int>>(curr->valPair)
static\u cast(curr->valPair)
curr->valPair-正在返回std::pair
但它返回了一个错误:
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'类型的右值初始化'std::pair&'类型的非常量引用无效
[编辑:简而言之,问题是如何将std::pair
转换为std::pair
]
编辑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;
}
#包括
使用名称空间std;
甲级
{
std::pair-valPair;
公众:
std::pair&getPairByReference();
};
std::pair&A::getPairByReference()
{
返回向量对;
}
int main()
{
A A;
a、 getPairByReference();
返回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>’
try-5.cpp:在成员函数“std::pair&A::getPairByReference()”中:
try-5.cpp:15:12:错误:从'std::pair'类型的表达式初始化'std::pair&'类型的引用无效
只有在转换后不再需要curr->valPair
时,您才可能尝试执行此操作,然后
std::pair<const string, int> newPair(std::move(curr->valPair));
std::pairnewpair(std::move(curr->valPair));
通过移动构造将std::pair
移动到std::pair
中
如果必须保留curr->valPair
的值,则无法执行此操作,因为类型转换需要构造目标类型的实例。只有通过移动才能避免复制字符串
但是,您可能希望执行此转换,因为您需要在某个地方使用const string
指定的目标类型。如果你能解释一下它的用途就更好了。问题可能就在那里
问题编辑后:
不能将类型为std::pair&
的引用指向类型为std::pair
的对象。这是两种完全独立的类型。您需要先构造类型为std::pair
的对象,然后才能引用此类类型
补充说明:
reinterpret\u cast
可能在这里有效(并且会导致我的上述陈述出现例外),我不确定。请参阅@StoryTeller的答案。即使std::string
可以隐式转换为const std::string
,但这两对类型是不同的。
您想要做的是重新解释到std::pair&
执行
reinterpret\u cast
意味着您可以通过完全绕过类型系统来抑制几乎所有的编译器诊断。在这种情况下,它可能是相当良性的,但一般来说,你最好确切地知道你在做什么。我想我得到了你想要的。您有一个类成员是对(非常量),但希望该类的用户引用该成员,但也希望不允许用户修改第一项。我说得对吗
与其为模板参数引用具有不同常量限定符的一对(pair&
来自pair
),也许您可以使用具有不同常量限定符的一对引用(pair
而不是pair&
)
构造一对引用比复制成员便宜得多。如果您确实希望用户修改原始实例上的第二个参数,那么该副本可能没有意义
要构造引用对,请执行以下操作:
std::pair<const string&, int&> A::getPairByReference()
{
return {valPair.first, valPair.second};
}
std::pair A::getPairByReference()
{
返回{valPair.first,valPair.second};
}
你能解释一下这个问题出了什么问题吗?你的问题缺少很多上下文。什么是curr,错误消息提到的引用是什么,等等。请提供一个最小的、完整的和可验证的示例@Eichhörnchen-我在问题中提到Curr->valPair是std::Pairf如果你把一个X转换成一个Y,你就得到了一个新的Y。你想做什么,不想做什么?对不起,如果这个问题让人困惑。。我将添加一个小的测试代码。我已经添加了一个示例代码,我正在尝试做类似的事情。我想返回valPair的引用,如所讨论的代码中所示。@MayankJain扩展了我的回答,我认为您在这里遇到了一个问题。在这种情况下,我将更改类本身的成员。谢谢。