为什么 C++ 核心指南不建议在适当时在指针上使用 std::optional?[关闭]

Why do the C++ Core Guidelines not recommend to use std::optional over pointers when approriate? [closed]

提问人:Henk 提问时间:11/16/2022 最后编辑:Henk 更新时间:11/16/2022 访问量:373

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

去年关闭。

在 C++ 核心指南中仅引用一次:std::optional

如果需要可选值的概念,请使用指针、std::optional 或用于表示“无值”的特殊值。

除此之外,指南中没有提到它,因此在表达可选值的意图时,特别不建议使用它来代替指针。

与在非多态上下文中可能为 null 的指针相比,使用 of 是否有任何缺点?std::optional

因此仅作为旁注和指针的第二个选项。 对我来说,这似乎更具表现力。使用指针时,您永远无法真正确定 a 选项是否是有意的。std::optionalstd::optionalnullptr

c++ std可选 cpp-core-guidelines

评论

1赞 463035818_is_not_an_ai 11/16/2022
这个问题缺乏背景。您引用的唯一部分确实提到了.std::optional
1赞 463035818_is_not_an_ai 11/16/2022
你想念哪里被提及?std::optional
6赞 Caleth 11/16/2022
“为什么不推荐使用”它正在推荐std::optionalstd::optional
2赞 463035818_is_not_an_ai 11/16/2022
std::optional不动态分配存储的对象。这是优点还是缺点取决于,但它不等同于传递指针。假设您有一个这样的函数: .你不会重构它来使用(至少在不对调用代码进行大量重构的情况下不会)void foo(SomeCustomTypeThatIsExpensiveToCopy *);std::optional
3赞 463035818_is_not_an_ai 11/16/2022
@PaulSanders wandbox.org/permlink/2cfuOMy2ep9EhaWw ;)

答:

3赞 Caleth 11/16/2022 #1

该指南没有按照“先选这个”的顺序列出内容。它列出了适合不同情况的选项,并由您决定最适合您的情况。

具体而言,在 () 和 之间进行选择与在 () 和 之间进行选择相同。改编封闭规则的示例,您将拥有constT*std::optional<T>constT&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与遵循的指南无关,作为函数的编写者,您必须假设指针可以是 ,那么您是安全的。作为函数的用户,您可以假设它已记录或是采用原始指针的函数的有效参数,或者您可以认为该函数已损坏。nullptrnullptr