-2

在下面的函数中, doA被覆盖以接受std::string的const&&&,doA_ 被覆盖以接受这两种类型的std::initializer_list。但似乎有问题的是,在第一个 doA_ 函数中,std::move 没有正确地将“std::string”转换为“std::string&&”,所以调用了第二个 doA,而不是第一个。即使我改用'doA(static_case(*it))',结果也是一样的。但是,如果我使用'doA("a string")',则调用第一个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 &
4

1 回答 1

1

*std::begin(l)是 type 的左值const std::string,而不是 type的左值std::stringstd::move(*std::begin(l))type 的右值也是如此const std::string。所以doA(std::string&&)不能被调用——绑定它的参数会丢弃const. 只有doA(const std::string&)一个可行的功能。

于 2017-03-31T23:47:47.863 回答