【发布时间】:2019-01-30 11:29:18
【问题描述】:
将左值引用作为右值引用参数传递不会编译。编译器可以使用其复制构造函数创建一个临时对象并将其作为右值传递,但事实并非如此。不过,如果类型不匹配,它确实会调用构造函数。
我很感兴趣,为什么会这样? C++ 标准中的哪种设计逻辑迫使编译器以不同的方式处理复制构造函数?
void do_smth(string && s)
{}
void f(const char * s)
{
do_smth(s); // passes a temporary string constructed from const char*
}
void g(const string & s)
{
do_smth(s); // does not compile
}
void h(const string & s)
{
do_smth(string(s)); // ok again
}
不想实现第二个签名do_smth(const string &)怎么办?我应该改用传递值void do_smth(string s) 吗?
假定对象string 具有移动构造函数,按值void do_smth(string s) 和右值引用void do_smth(string && s) 之间还有哪些其他区别?
【问题讨论】:
-
是的,按值传递在这里会非常有用。
-
相关question.
标签: c++ rvalue-reference