相关疑难解决方法(0)

为什么在Herb Sutter的CppCon 2014演讲(回归基础:现代C++风格)中不推荐使用setter成员函数?

在Herb Sutter的CppCon 2014谈话回归基础:现代C++风格他在幻灯片28(幻灯片的网络副本在这里)上引用了这种模式:

class employee {
  std::string name_;
public:
  void set_name(std::string name) noexcept { name_ = std::move(name); }
};
Run Code Online (Sandbox Code Playgroud)

他说这是有问题的,因为当用临时调用set_name()时,noexcept-ness不强(他使用短语"noexcept-ish").

现在,我在我最近的C++代码中使用了上述模式,主要是因为它节省了我每次都输入两个set_name()的副本 - 是的,我知道每次强制复制构造都会有点效率低下,但是,嘿,我是一个懒惰的人.然而Herb的短语"这个noexcept是有问题的 "让我担心,因为我没有在这里得到问题:std :: string的移动赋值运算符是noexcept,因为它的析构函数,所以上面的set_name()似乎保证noexcept.我确实看到编译器 set_name()之前抛出了一个潜在的异常,因为它准备了参数,但我很难看到它有问题.

后来在幻灯片32上Herb明确指出上面是一个反模式.有人可以向我解释为什么我一直懒惰地编写糟糕的代码?

c++ stl c++11

62
推荐指数
3
解决办法
5550
查看次数

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

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

c++ parameter-passing c++11

4
推荐指数
1
解决办法
1446
查看次数

标签 统计

c++ ×2

c++11 ×2

parameter-passing ×1

stl ×1