2017-05-12 11 views
0

私はstd::stringを返すゲッターを持っていて、それをchar arrayにコピーしたいと思います。 私の最初の試みは、アプリケーションをクラッシュしていました:std :: copy with return values - "expression:string iterators incompatible"を防ぐより良い方法は?

std::string temp = getString(); 
std::copy(temp.begin(), temp.end(), array); 

一時変数を使用したりする戻り値の型を変更するよりも任意のより良い方法があります:expression: string iterators incompatible

std::copy(getString().begin(), getString().end(), array); 

私は一時変数を追加することによってそれを解決しましたポインタ(テストしませんでしたが、これも動作すると思います)?

ありがとうございました!

+3

のイテレータをサポートしている任意のタイプの参照のいずれかを返すことができます。 getString() 'return? –

+4

ベットすると一時的な文字列が返されます。したがって、beginおよびendイテレータは異なる文字列を繰り返しています。 –

+0

@BenSteffanリチャードは、単にオブジェクトのメンバーである 'std :: string'を返します。 – honiahaka10

答えて

3

返品の種類がgetString()であるとは限りません。いくつかのオプションがあります。そのインターフェイスは将来変更される可能性として

std::string getString();

const std::string& getString();

std::string& getString();

理想的には私たちが何を気にしていないあなたがいない場合のように(それが今日に聞こえますそれについて確かに)。インタフェース変更の不幸な出来事でクライアントコードを修正する必要がなければ、役立つでしょう。

そうではなく、一時的

は、const参照を取る:

const std::string& temp = getString(); 
std::copy(temp.begin(), temp.end(), array); 

それはgetStringが実際に文字列のコピーを返した場合、それは寿命が参照temp限り続くということを学ぶためにあなたを驚かせるかもしれません。

参照を返すと、コードは引き続き動作します。 C++ 14のよう

、それはより一般的なことは貴重です:

auto&& temp = getString(); 
std::copy(std::begin(temp), std::end(temp), array); 

getString()今オブジェクトまたは `を何value_typechar

+0

'auto && temp'アプローチはC++ 11と同様に価値がありませんか? – cdhowie

+0

@cdhowieあなたが正しいです。私の間違い。 –

+0

ありがとうございます!私は戻り値の型を 'std :: string'から' const std :: string& 'に変更しました。@cdhowieのように、うまくいきました! – honiahaka10

関連する問題