Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::pair中的常量转换_C++_Std Pair - Fatal编程技术网

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扩展了我的回答,我认为您在这里遇到了一个问题。在这种情况下,我将更改类本身的成员。谢谢。