2016-10-13 13 views
-2

実際に新しいペアを作成せずにstd::pair<const string,int>std::pair<string,int>に変換するにはどうすればよいですか?std :: pairコンストコンバート

私は以下のように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>に変換する方法です。

EDIT2:

それをコンパイルしている間、私はエラーの下に取得しています発行し

#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>’ 
+0

あなたは質問が間違っているかを説明していただけますか? –

+0

あなたの質問には多くの文脈がありません。 currとは何か、エラーメッセージに言及している参照は何かなどです。最小限の、完全で検証可能な例を提供してください。 http://stackoverflow.com/help/mcve。 – mars

+0

@Eichhörnchen - 私は質問で言いました.curr-> valPairがstdです:: pair

答えて

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<int, int>のオブジェクトを指すタイプstd::pair<const int, int>&の参照を持つことはできません。これらは完全に独立した2つのタイプです。そのような型への参照を持つには、先にタイプstd::pair<const int, int>のオブジェクトを構築する必要があります。

追加注:

reinterpret_castがここに有効である(上記の私の文に例外が発生します)、私は、here is a discussion on the topicわかりません。 @ StoryTellerの答えを見てください。

+0

サンプルコードを追加しました。私は同様のことをやろうとしています。問題のコードのようにvalPairの参照を返したい –

+0

@MayankJain私の答えを広げて、私はあなたが[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)に走っていると思います。 – user4407569

+0

この場合、クラスそのもののメンバーを変更します。どうもありがとう。 –

0

std::stringが暗黙的にconst std::stringに変換可能であっても、2つのペアのタイプが異なります。 あなたがしようとしているのはreinterpret_caststd::pair<const std::string, int>&です。

reinterpret_castを実行すると、ほぼすべてのコンパイラー診断を抑制することができます。これは、タイプシステムを完全に回避することによって行われます。この場合、それはかなり良性かもしれませんが、一般的にはあなたがしていることを正確に知ることが大切です。

0

私はあなたが望むものを得たと思う。pair<T, U>(非const)のクラスメンバーがありますが、クラスのユーザーがそのメンバーを参照するだけでなく、ユーザーが最初のアイテムを変更できないようにしたいとします。私は正しい?

代わりのテンプレート引数に異なるのconst修飾子とペアへの参照(pair<T, U>からpair<const T, U>&)多分あなたは違うのconst修飾子(pair<const T&, U&>の代わりpair<const T, U>&)を参照のペアを使用することができますを作ります。

参照のペアを作成することは、メンバーをコピーするよりもはるかに安いです。また、元のインスタンスの2番目のパラメータをユーザーが変更する必要がある場合は、おそらくコピーは意味をなさないでしょう。

参照のペアを構築するために:

std::pair<const string&, int&> A::getPairByReference() 
{ 
    return {valPair.first, valPair.second}; 
} 
関連する問題