2017-03-31 2 views
-2
funtionsで

怒鳴る、DOAは&とのstd ::文字列の& &は、doA_はSTDこれらの2つのタイプ:: initializer_listを受け入れるようにオーバーライドされのconstを受け入れるようにオーバーライドされます。しかし、間違っていると思われるのは、fisrt doA_関数では、std :: moveが 'std :: string'を 'std :: string & &'に正しくキャストしないため、最初のものではなく、 1。代わりに 'doA(static_case(* it))'を使用しても、同じ結果になります。ただし、 'doA( "文字列")'を使用すると、最初のdoAが呼び出されます。 なぜそれが違うのですか?なぜC++のstd :: moveはstd :: initializer_listの要素を実際にキャストしないのですか?右辺値

#include <string> 
#include <iostream> 

void doA(std::string &&s) 
{ 
     std::cout << "doA && "<<std::endl; 
} 

void doA(const std::string &s) 
{ 
     std::cout << "doA const & "<<std::endl; 
} 
void doA_(initializer_list<std::string> &&l) 
{ 
     std::cout << "doA_ &&"<<std::endl; 
     auto it=std::begin(l); 
     doA(std::move(*it));//print 'doA const &',but it is expected to be 'doA &&' 
     //doA(static_cast<const std::string &&>(*it)); //same with above 
     //doA("a string"); //print 'doA &&' 
       //======Doesn't work as expected 

} 
void doA_(const initializer_list<std::string> &l) 
{ 
     std::cout << "doA_ const &"<<std::endl; 
     auto it=std::begin(l); 
     doA(*it); 
} 


int main() 
{ 
     initializer_list<std::string> l={"a","b"}; 
     doA_(l);//doA_ const & 
     doA_(std::move(l));//doA_ && 
     doA_({"c","d"});//doA_ && 
     return 0; 
} 

//=========output 
    doA_ const & 
    doA const & 
    doA_ && 
    doA const & 
    doA_ && 
    doA const & 
+3

"うまくいかない"ということを詳しく教えてもらえますか? *どのように動作しませんか?ビルドエラーが出ますか?実行時にクラッシュしますか?予想外の結果ですか?あなたの質問を編集して、質問の本文にすべての詳細を含めるようにしてください。また、[良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask)に時間を割いてください。 –

答えて

1

*std::begin(l)タイプconst std::stringの、ないタイプstd::stringの左辺値です。したがって、std::move(*std::begin(l))const std::stringの値です。したがってdoA(std::string&&)は呼び出すことができません。そのパラメータをバインドすると、constは破棄されます。実行可能な機能はdoA(const std::string&)のみです。

+0

ええと、そうです。実際にinitializer_listからコンテナに文字列を移動したいのですが? initializer_listでelmentsをnon-constにする方法はありますか? –

関連する問題