如何避免在C++中通过引用传递临时对象时显式调用构造函数?

0 c++ pass-by-reference

假设我有一节课:

class String
{
public:
     String(char *str);
};
Run Code Online (Sandbox Code Playgroud)

还有两个功能:

void DoSomethingByVal(String Str);
void DoSomethingByRef(String &Str);
Run Code Online (Sandbox Code Playgroud)

如果我像这样调用DoSomethingByVal:

DoSomethingByVal("My string");
Run Code Online (Sandbox Code Playgroud)

编译器指出它应该创建一个临时的String对象并调用char*构造函数.

但是,如果我尝试以相同的方式使用DoSomethingByRef,我会得到"无法将参数从'char*'转换为'String&'"错误.

相反,我必须显式创建一个实例:

DoSomethingByRef(String("My string"));
Run Code Online (Sandbox Code Playgroud)

这可以让人感到烦恼.

有什么方法可以避免这种情况吗?

Mar*_*ork 9

你需要传递const引用:

对于:

void DoSomethingByVal(String Str);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,编译器首先创建一个临时变量.然后将临时变量复制到参数中.

对于:

void DoSomethingByRef(String const& Str);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,编译器会创建一个临时变量.但临时变量不能绑定到引用,它们只能绑定到const引用,因此无法调用原始函数.请注意,std :: string对象构造函数采用const引用是复制构造函数的参数,这就是第一个版本工作的原因,因为临时仅绑定到复制构造函数的const引用参数.