[英]Why am I unable to use my increment operator overload? [C++]
我有以下結構:
struct sequence_t {
uint8_t val;
explicit sequence_t(uint8_t value) : val(value) {}
sequence_t() : sequence_t(0) {}
auto operator++() -> sequence_t& { // prefix
val = (val + 1) % 16;
return *this;
}
auto operator++(int) -> sequence_t { // postfix
sequence_t tmp{val};
++*this;
return tmp;
}
uint8_t value() const { return val; }
auto operator==(const sequence_t& other) const -> bool = default;
auto operator==(const uint8_t other) const -> bool { return val == other; }
};
我在這樣聲明的 class 中使用它:
class messenger {
private:
sequence_t sequence;
public:
messenger() = default;
~messenger() = default;
auto make_message(const uint8_t type) const -> std::shared_ptr<std::uint8_t[]>;
auto make_message(uint8_t const* data, const uint8_t size) const -> std::shared_ptr<std::uint8_t[]>;
auto parity(uint8_t const* buffer) const -> std::uint8_t;
};
我在信使 class 的 make_message() 成員中調用運算符,因為我想在創建消息時更新序列的值(到整個信使對象):
auto messenger::make_message(uint8_t const* data, const uint8_t data_size) const -> std::shared_ptr<std::uint8_t[]> {
auto buffer = std::make_shared<std::uint8_t[]>(sizeof(header) + data_size + sizeof(parity(nullptr)));
++sequence;
header h = {START, data_size, sequence.value(), TYPE_DATA}; // TODO: implementar sequência
std::copy(std::bit_cast<uint8_t*>(&h), std::bit_cast<uint8_t*>(&h) + sizeof(header), buffer.get());
std::copy(data, data + data_size, buffer.get() + sizeof(header));
buffer[sizeof(header) + data_size] = parity(buffer.get());
return buffer;
}
但是,當我嘗試在信使 class 方法中使用 sequence++ 或 ++sequence 時,我收到以下錯誤:
error: passing ‘const sequence_t’ as ‘this’ argument discards qualifiers [-fpermissive]
[build] 17 | ++sequence;
[build] | ^~~~~~~~
為什么是常量? 如何修改序列的內容?
auto messenger::make_message(uint8_t const* data, const uint8_t data_size) const
最后的const
關鍵字表示這是一個const
class 方法。 一個const
class 方法:
const
class 方法const
方法 (忽略顯式mutable
class 成員,以避免混淆)
++sequence
有效地調用了sequence
的方法。 根據規則 3,它不是const
class 方法,因此會出現編譯錯誤。
您有以下選擇:
make_message()
更改為不是const
class 方法。sequence
聲明為mutable
class 成員可能是可行的。 您必須充分了解這樣做的后果。 您在const
object 上使用重載增量運算符,但運算符本身不是const
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.