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