#include <iostream>
#include <string>
void fnc (const std::string&)
{
std::cout<<1;
}
void fnc (std::string&&)
{
std::cout<<2;
}
int main()
{
fnc ("abc");
}
Всех компиляторы выбирают std::string&&
версии fnc
, и это логично, потому что временная std::string
создается для ссылки связывания, но я не могу найти, где это описанных в стандарте C++ 14. я нашел один абзац там (3.2):разрешения перегрузки между константной ссылкой Lvalue и ссылкой RValue
- Стандартная последовательность преобразования S1 является лучшей последовательностью преобразования, чем стандартной последовательность преобразования S2, если
[...]
- S1 и S2 являются ссылочными привязками (8.5.3), и ни один из них не ссылается на параметр неявного объекта нестатической функции-члена, объявленный без рефлектоватора, и S1 связывает ссылку rvalue с rvalue и S2 связывается именующим присвоенный
Но это не тот случай, так как S1, связывает ссылку RValue к именующему («ABC», именующей постройка полукокса [4]). Где я могу найти описание, по которому выбрана вторая перегрузка?
P.S. Я указал на C++ 14 Standard вместо C++ 11, потому что знаю, что в C++ 11 были некоторые отчеты о дефектах, связанные с привязкой ссылки rvalue.
Это преобразование между массивами и указателями, а не l-to-r. –
@ T.C. Да, вы правы, исправлены. – vsoftco