2017-09-14 26 views
0

私は、コンストラクタガットVSコンパイラの警告C4239 STDをキャストしようとしている::ベクトル<はstd ::ペア<T, U>>

Foo::Foo(std::vector<std::pair<int, char>> &Data) 
    : //Initialization list 
{ 
    //Some other initialization 
} 

のように書かれており、私はそれを呼び出すようにしようとしたクラスFooを持っています

Foo(std::vector<std::pair<int, char>> 
    { 
     {10, 'a'} 
    }); 

と私のコードでは、コンパイラは、私に言ってC4239を与えること

nonstandard extension used: 'argument': conversion from 
'std::vector<std::pair<int,char>,std::allocator<_Ty>>' to 
'std::vector<std::pair<int,char>,std::allocator<_Ty>> &' 

私はこのメッセージを理解していますが、コンパイラがそのような変換を喜ばないのはなぜですか?

ありがとうございます。

+0

なぜ 'std :: make_pair'ではないのですか? –

答えて

2

一時参照を非const参照にバインドしようとしています。

を考えてみましょう:

Foo::Foo(const std::vector<std::pair<int, char>> &Data) 

ビャーネ・ストロヴストルップのC++11 - the new ISO C++ standard(強調鉱山)によると:

C++では、非const参照は左辺値とのconst参照にバインドすることができ左辺値または右辺値にバインドすることができ、非定数rvalueにバインドすることはできません。 これは、新しい値を使用する前に破壊された一時的な値の変更を人々が守るためです。

+0

ありがとうございます。 constを追加すると警告が解決されます。しかし、一時的な値が非const参照にここでバインドできないのはなぜですか? – user3291342

+0

@ user3291342標準では許可されていませんが、仮説を修正する可能性が混乱する可能性があると私は考えます。 – AlexD

関連する問題