为什么C ++ std :: move不会真正对std :: initializer_list中的元素进行强制转换?右值

时间:2017-03-31 15:23:55

标签: c++ c++11 stdmove

在下面的功能中, doA 被覆盖以接受 std :: string <的 const&amp; &amp;&amp; / em>,doA_被覆盖以接受这两种类型的 std :: initializer_list 。但似乎错误的是,在fisrt doA_函数中,std :: move没有正确地强制转换std :: string&#39; to&#39; std :: string&amp;&amp;&#39;,所以第二个doA被调用,而不是第一个。即使我使用&#39; doA(static_case(* it))&#39;相反,它是相同的结果。但是,如果我使用&#39; doA(&#34;字符串&#34;)&#39;,则第一个doA调用。 为什么会这样?为什么他们表现不一样?

#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 &

1 个答案:

答案 0 :(得分:1)

isTodayOrFuture(YOUR_TEST_DATE_HERE) *std::begin(l)类型的左值,而不是const std::string类型的左值。因此std::stringstd::move(*std::begin(l))类型的右值。因此无法调用const std::string - 绑定其参数会丢弃doA(std::string&&)。只有const才是可行的功能。