提问人:Henk 提问时间:11/16/2022 最后编辑:Henk 更新时间:11/16/2022 访问量:373
为什么 C++ 核心指南不建议在适当时在指针上使用 std::optional?[关闭]
Why do the C++ Core Guidelines not recommend to use std::optional over pointers when approriate? [closed]
问:
在 C++ 核心指南中仅引用一次:std::optional
如果需要可选值的概念,请使用指针、std::optional 或用于表示“无值”的特殊值。
除此之外,指南中没有提到它,因此在表达可选值的意图时,特别不建议使用它来代替指针。
与在非多态上下文中可能为 null 的指针相比,使用 of 是否有任何缺点?std::optional
因此仅作为旁注和指针的第二个选项。
对我来说,这似乎更具表现力。使用指针时,您永远无法真正确定 a 选项是否是有意的。std::optional
std::optional
nullptr
答:
3赞
Caleth
11/16/2022
#1
该指南没有按照“先选这个”的顺序列出内容。它列出了适合不同情况的选项,并由您决定最适合您的情况。
具体而言,在 () 和 之间进行选择与在 () 和 之间进行选择相同。改编封闭规则的示例,您将拥有const
T*
std::optional<T>
const
T&
T
// optional<int> is cheap to copy, pass by value
optional<int> multiply(int, optional<int>);
// suffix is optional and input-only but not as cheap as an int, pass by const*
string& concatenate(string&, const string* suffix);
旁白:如果您遵循其他准则,则可以确定指针指示“无值”是预期情况的情况。
评论
0赞
Henk
11/16/2022
当然,如果你可以假设每个人都使用这些准则,那么指针总是可以的,这代表了意义。但是,当您阅读其他人的代码时,您不知道它遵循什么原则。nullptr
1赞
463035818_is_not_an_ai
11/17/2022
@Henk与遵循的指南无关,作为函数的编写者,您必须假设指针可以是 ,那么您是安全的。作为函数的用户,您可以假设它已记录或是采用原始指针的函数的有效参数,或者您可以认为该函数已损坏。nullptr
nullptr
评论
std::optional
std::optional
std::optional
std::optional
std::optional
不动态分配存储的对象。这是优点还是缺点取决于,但它不等同于传递指针。假设您有一个这样的函数: .你不会重构它来使用(至少在不对调用代码进行大量重构的情况下不会)void foo(SomeCustomTypeThatIsExpensiveToCopy *);
std::optional