const lvalue reference和rvalue reference之间的重载分辨率

use*_*538 5 c++ rvalue-reference overload-resolution c++14

#include <iostream>
#include <string>

void fnc (const std::string&)
{
    std::cout<<1;
}

void fnc (std::string&&)
{
    std::cout<<2;
}

int main()
{
    fnc ("abc");
}
Run Code Online (Sandbox Code Playgroud)

所有的编译器选择std::string&&版本fnc,并且它是合乎逻辑的,因为临时std::string是为引用绑定创建的,但我找不到,它在C++ 14 Standard中描述了什么.我在那里发现了一个段落(3.2):

- 标准转换序列S1是比标准转换序列S2更好的转换序列

[...]

- S1和S2是引用绑定(8.5.3),并且都不引用没有ref-qualifier声明的非静态成员函数的隐式对象参数,S1将rvalue引用绑定到rvalue ,S2绑定左值引用

但事实并非如此,因为S1将一个右值引用绑定到一个左值("abc",即const char [4]的左值).我在哪里可以找到描述,选择第二个过载?

PS我指的是C++ 14 Standard而不是C++ 11,因为我知道,C++ 11中存在一些与rvalue引用绑定相关联的缺陷报告.

vso*_*tco 7

首先,编译器执行隐式数组到指针的转换"abc",因此类型"abc"变为const char*.第二个(你可能错过了),通过非显式构造函数(链接中的#5 )const char*转换为rvalue .构造的右值是第二次过载的完美匹配,因此选择第二次过载.std::stringconst char* std::stringstd::string

  • 这是一个数组到指针的转换,而不是l-to-r. (3认同)