C ++ 11 — Почему C ++ std :: move действительно не выполняет приведение к элементам в std :: initializer_list? Rvalue

В функциях ниже, DOA отменяется, чтобы принять Const& а также && из станд :: строка, doA_ переопределяется, чтобы принять эти два типа станд :: 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 &

-2

Решение

*std::begin(l) является lvalue типа const std::stringне тип std::string, Так std::move(*std::begin(l)) это значение типа const std::string, Так doA(std::string&&) не может быть вызван — привязка его параметра будет отбрасывать const, Только doA(const std::string&) это жизнеспособная функция.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]