const或ref或const ref或value作为setter函数的参数

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.可能是函数体在某些情况下是不正确的.

Bat*_*eba 7

  1. 通过价值:一般不好,因为可能会采取价值副本.(虽然移动构造函数可能会缓解).

  2. 通过引用传递:不好,因为函数可能会修改传递的参数.匿名临时也无法绑定到引用.

  3. 通过const参考:仍然是最好的.没有复制,函数无法修改参数,匿名临时可以绑定到const引用.

  4. 通过&&变体传递:目前毫无意义,因为根据您编写函数体的方式,没有移动语义.如果您已经编写std::move(m_parameter, parameter)了代替赋值,那么在某些情况下这可能会胜过(3),编译器会选择更好的.

  • @TartanLlama pass-by-value和pass-by-const-ref都有这样的情况,它们(理论上)比另一个更有效. (2认同)