代码之家  ›  专栏  ›  技术社区  ›  Mayank Jain

std::对中的常量转换

  •  -1
  • Mayank Jain  · 技术社区  · 8 年前

    如何转换 std::pair<const string,int> std::pair<string,int> 而不是做一双新的?

    我尝试使用static_cast如下:

    static_cast<std::pair<const string, int>>(curr->valPair)
    

    当前->;瓦尔帕伊-回来了 std::对<字符串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::对<字符串int> std::对<常量字符串,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>’
    
    3 回复  |  直到 8 年前
        1
  •  4
  •   user4407569 user4407569    8 年前

    只有在以下情况下,你才可能尝试做的事情: curr->valPair 转换后不再需要,则

    std::pair<const string, int> newPair(std::move(curr->valPair));
    

    移动 std::pair<string, int> 通过将结构移动到 std::pair<const string, int> .

    如果 当前->;勇士 由于类型转换需要构造目标类型的实例,因此无法执行此操作。复制字符串只能通过移动来避免。

    但是,您可能希望进行这种转换,因为您需要特定的目标类型 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 见“讲故事人”的回答。

        2
  •  1
  •   André Sassi    8 年前

    pair<T, U>

    而不是为模板参数引用具有不同常量限定符的对( pair<const T, U>& 从…起 对<T、 U> )也许您可以使用一对具有不同常量限定符的引用( pair<const T&, U&> 而不是 对<常数T,U>& ).

    构造一对引用比复制成员便宜得多。如果您确实希望用户修改原始实例上的第二个参数,那么复制可能没有意义。

    要构造引用对:

    std::pair<const string&, int&> A::getPairByReference()
    {
        return {valPair.first, valPair.second};
    }
    
        3
  •  0
  •   StoryTeller - Unslander Monica    8 年前

    尽管 std::string 可隐式转换为 const std::string ,这两种对类型是不同的。 你想做的是 reinterpret_cast std::pair<const std::string, int>& .

    重新解释_cast 这意味着您可以通过完全绕过类型系统来抑制几乎所有的编译器诊断。在这种情况下,这可能是相当良性的,但一般来说,你更清楚自己在做什么。