vla*_*don 4 c++ parameter-passing c++11
Constantness
class MyClass {
// ...
private:
std::string m_parameter;
// ...
}
Run Code Online (Sandbox Code Playgroud)
通过按值:
void MyClass::SetParameter(std::string parameter)
{
m_parameter = parameter;
}
Run Code Online (Sandbox Code Playgroud)
传址参考:
void MyClass::SetParameter(std::string& parameter)
{
m_parameter = parameter;
}
Run Code Online (Sandbox Code Playgroud)
传址常量-REF:
void MyClass::SetParameter(const std::string& parameter)
{
m_parameter = parameter;
}
Run Code Online (Sandbox Code Playgroud)
传址常量值:
void MyClass::SetParameter(const std::string parameter)
{
m_parameter = parameter;
}
Run Code Online (Sandbox Code Playgroud)
传址通用-REF:
void MyClass::SetParameter(std::string&& parameter)
{
m_parameter = parameter;
}
Run Code Online (Sandbox Code Playgroud)
传址常量万能-REF:
void MyClass::SetParameter(const std::string&& parameter)
{
m_parameter = parameter;
}
Run Code Online (Sandbox Code Playgroud)
哪种变体最好(可能就C++ 11及其移动语义而言)?
PS.可能是函数体在某些情况下是不正确的.
通过价值:一般不好,因为可能会采取价值副本.(虽然移动构造函数可能会缓解).
通过引用传递:不好,因为函数可能会修改传递的参数.匿名临时也无法绑定到引用.
通过const参考:仍然是最好的.没有复制,函数无法修改参数,匿名临时可以绑定到const引用.
通过&&变体传递:目前毫无意义,因为根据您编写函数体的方式,没有移动语义.如果您已经编写std::move(m_parameter, parameter)了代替赋值,那么在某些情况下这可能会胜过(3),编译器会选择更好的.