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



在下面的函数中,doA 被覆盖以接受 const& 和 && of std::string,doA_被覆盖以接受这两种类型的 std::initializer_list。但似乎错误的是,在 fisrt doA_ 函数中,std::move 没有正确地将 'std::string' 转换为 'std::string&&',所以调用了第二个 doA,而不是第一个。即使我使用"doA(static_case(*it(("代替,也是相同的结果。但是,如果我使用"doA("字符串"(",则调用第一个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 &

>*std::begin(l)是类型const std::string的左值,而不是std::string类型的左值。 所以std::move(*std::begin(l))const std::string 型的右值。 所以不能调用doA(std::string&&) - 绑定其参数将丢弃const。 只有doA(const std::string&)才是可行的功能。

最新更新