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_caststd::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};
}