noexcept 表达式的条件

问题描述 投票:0回答:1

请告诉我在这种情况下我是否正确定义了 noexcept 表达式 的条件?

class scheme_host_port
    {
    public:
        using value_type = std::string;

        scheme_host_port() = delete;
        scheme_host_port(value_type const &value) noexcept(std::is_nothrow_copy_constructible_v<value_type>) : value_{value} {};
        scheme_host_port(value_type &&value) noexcept(std::is_nothrow_move_constructible_v<value_type>) : value_{value} {};

        scheme_host_port(scheme_host_port const &) = delete;            
        scheme_host_port &operator=(scheme_host_port const &) = delete;

        scheme_host_port(scheme_host_port &&) noexcept(std::is_nothrow_move_constructible_v<value_type>) = default;
        scheme_host_port &operator=(scheme_host_port &&) noexcept(std::is_nothrow_move_assignable_v<value_type>) = default;
        value_type operator()() const { return value_; }                                                                    
        bool operator==(scheme_host_port const &rhs) const noexcept { return this->value_ == rhs.value_; }
        bool operator!=(scheme_host_port const &rhs) const noexcept { return !(this->value_ == rhs.value_); }

    private:
        value_type value_;
    };
c++ c++17 noexcept
1个回答
0
投票
class scheme_host_port {
public:
    using value_type = std::string;

    scheme_host_port() = delete;

    // Copy constructor can throw, so no noexcept here
    scheme_host_port(value_type const &value) noexcept(false) : value_{value} {}

    // Move constructor is noexcept
    scheme_host_port(value_type &&value) noexcept : value_{std::move(value)} {}

    scheme_host_port(scheme_host_port const &) = delete;            
    scheme_host_port &operator=(scheme_host_port const &) = delete;

    // Default move constructor and move assignment are noexcept
    scheme_host_port(scheme_host_port &&) noexcept = default;
    scheme_host_port &operator=(scheme_host_port &&) noexcept = default;

    value_type operator()() const { return value_; }

    // Comparison operators are noexcept
    bool operator==(scheme_host_port const &rhs) const noexcept { return this->value_ == rhs.value_; }
    bool operator!=(scheme_host_port const &rhs) const noexcept { return !(this->value_ == rhs.value_); }

private:
    value_type value_;
};
  • 复制构造函数不是 noexcept 因为 std::string 复制 操作可能会抛出异常。
  • 移动构造函数和移动赋值是 noexcept 基于 std::string 的移动操作的假设 没有例外。
  • 比较运算符是 no except 因为它们只 涉及比较,不会抛出异常。
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.