【发布时间】:2022-01-23 07:46:23
【问题描述】:
我有一个带有声明为void const * 的可选字段的类(我也很困惑是在尖括号之外还是在里面。
class Test {
protected:
std::optional<void const> *_data; // void const *_data
public:
explict Test(void const *data = nullptr);
}
在 Test.cpp 文件中。
Test(const void *data) {
this->_data = data; // error
}
【问题讨论】:
-
请详细说明您的具体错误。
-
void const*也等价于const void*。类型说明符中的const指的是const左侧的“事物”,除非在特殊情况下,您的类型中的“第一个”事物应该是const,并且您可以将const放置在任一它的左边或右边。我认为这只是为了可读性 - 也许是向后兼容。其他人可以谈谈历史原因。我个人更喜欢const void*到void const*,但你可以在野外找到两者。这只是一种风格。 -
既然您已经通过
void const*和const void*的比较清楚了,我也更喜欢const,因为这是我在其他语言中已经习惯的。谢谢。 -
函数调用者有责任检查返回值是否为 null 正确 - 无论如何,您的用户都必须使用
std::optional。现在,另一种选择是指定类的用户使用nullptr构造它是“未定义行为”或“非法”。并且对象内部存在nullptr不是有效状态。这将责任归于对象的“创建者”,而不是“用户”(即使他们可能是同一个人)。这一切都取决于您的 _data 是否为 nullptr -
constexpr static char const *const NAME = "Test";是一个const指针(指针 的值不得更改)到const char(chars 的值在数组不得更改)。constexpr使其中的一些冗余,因为constexpr暗示const反正。