std :: pair中的Const转换

时间:2016-10-13 19:16:22

标签: c++ std-pair

如何在不实际制作新配对的情况下将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;
}

3 个答案:

答案 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::stringreinterpret_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>&