这可能是显而易见的,但我认为这对我来说很难.鉴于这种:
void test(std::string&&) { }
std::string x{"test"};
test(std::move(x)); // ok
Run Code Online (Sandbox Code Playgroud)
此代码test() 使用rvalue引用作为参数调用,以便程序按照我的预期进行编译.
现在看看这个:
void other_test(const std::string&) { }
std::string x{"test"};
other_test(std::move(x)); // ok???
Run Code Online (Sandbox Code Playgroud)
在这里,我倾斜了.为什么这个版本会编译?所述std::move返回一个&&类型; 为什么我在第二种方法中没有出现错误const&?
我知道
int&& s = 5;
const int& s = 5;
Run Code Online (Sandbox Code Playgroud)
是有效的,因为在这两种情况下我提供的东西都没有左值,它没有地址.是&&与const&相同呢?如果不是,有区别吗?
Som*_*ken 11
std::move实际上并没有移动它自己的东西.对于演员而言,这只是一个奇特的名字T&&.调用test这样test(std::move(x));只能说明一个T&&隐式转换为一个const T&.编译器看到test它只接受const T&所以它将T&&返回的转换std::move为a const T&,这就是它的全部内容.
简单来说:
&& 可以绑定到非const rvalues(prvalues和xvalues)const && 可以绑定到rvalues(const和非const)& 可以绑定到非const左值const &可以绑定到rvalues(prvalues和xvalues)和lvalues(每个都是const和非const).阿卡什么的.如果您希望函数明确允许 const-Lvalue 对象,但明确不允许 Rvalue 对象,请像这样编写函数签名:
void test(const std::string&) { }
void test(std::string&&) = delete;//Will now be considered when matching signatures
int main() {
std::string string = "test";
test(string);//OK
//test(std::move(string));//Compile Error!
//test("Test2");//Compile Error!
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1180 次 |
| 最近记录: |