“noexcept”说明符用于获取者和二传手

`noexcept` specifier for getters and setters

本文关键字:二传手 获取 用于 noexcept 说明符      更新时间:2023-10-16

假设我有以下代码:

class A {
    public:
        void SetInteger(const int val) noexcept { integerMember = val; }
        void SetString(const std::string& val) { stringMember = val; }
        int GetInteger() const noexcept { return integerMember; }
        std::string GetString() const { return stringMember; }
    private:
        int integerMember;
        std::string stringMember;
}

对整型类型和指针使用 noexcept 对我来说似乎很明显。

但是,对于非整型类型(如类和结构(不显式在构造函数/复制构造函数及其部分的构造函数中抛出异常(意味着在构造函数体中使用throw(,建议是什么?

你应该避免为可能抛出的函数noexcept说明符(除非你准备好让你的代码调用std::terminate()(。显式throw说明符已弃用,因此不要依赖它们,而是使用 noexcept 运算符。例如

template<typename T>
class Foo
{
  T m_datum;
public:
  Foo& SetDatum(T const&x) noexcept(noexcept(m_datum=x))
  {
    m_datum = x;
    return *this;
  }
};

除了特殊成员函数之外,noexcept不是那么有用。但是,如果您想要它:

void SetString(const std::string& val) 
         noexcept(std::is_nothrow_copy_assignable<std::string>::value) {
}

getter 的第一种方法:

const std::string& GetString() const noexcept {return stringMember; }

第二种方式是二传手:

void SetString(std::string&& val) noexcept {
    swap(stringMember, val);
}