我在许多帖子中都读过Stack Overflow,当使用指针(用于参数或返回值)并允许||
(使其成为可选)时,通常最好使用nullptr
代替
但是如果指针指的是多态类型怎么办?最好使用std::optional
还是指针?
答案 0 :(得分:5)
optional
不适用于多态类型。它是一种值类型,多态基类不适用于optional
。就像在vector
或类似容器中放置多态基类一样无效。
返回一个指针。这些建议通常被称为"通常"。
答案 1 :(得分:2)
std::optional
proposal明确表示它不是多态的:
value_ptr
要求指向对象在中分配 免费商店。这意味着sizeof(value_ptr<T>)
已修复 不论T
。value_ptr
是多态的&#39;:类型的对象value_ptr<T>
可以指向DT
类型的对象,该对象派生自T
。 深层复制保留动态类型。可选不需要免费 商店分配:它的创造更有效率;它不是 &#34;多态型&#34;
您的选项归结为原始指针或unique_ptr
。如果您需要副本和原始指针,请使用unique_ptr
。
答案 2 :(得分:2)
您可以编写多态伪可选。
您将希望使用有界对象大小/对齐(可能是参数)实现小对象优化,并包括基类加上一组要删除的附加操作(如复制或移动)。我已经编写了一个有界的多态类型而没有指针回退,如果由于类似的原因缺少空间而无法编译,可能是在SO上发布的。
可选不是多态的,但是常规和伪常规值类型可以。可选的over pointers / smart ptrs的大多数参数实际上是使用常规和伪常规非分配类型的参数。
答案 3 :(得分:1)
“我已经在很多帖子中读过stackoverflow,当使用指针(对于参数或返回值)并允许
nullptr
(使其成为可选)时,通常会更好改为使用std::optional
。
据推测,您指的是使用std::optional
来携带除指针或引用之外的值。在这种情况下,您正在谈论可选的参数或可选的返回值。
将optional
用于可选的in-argument具有以下缺点:对象被复制或至少移动,这可能是不期望的。此外,它排除了多态性。
最简单的方法是避免不必要的复制,并支持多态,是使用指向const
的指针:
void foo( Some_type const* p_object )
但是调用者必须在实际参数上使用&
运算符。
为简化调用,您可以提供重载语法含糖:
void foo() { foo( nullptr ); }
void foo( Some_type const& object ) { foo( &object ); }
支持
之类的调用foo();
和
foo( o );
使用optional
作为返回值的优点是,当调用代码正确检查值存在时,可以避免异常抛出。但是它似乎排除了包装对象的普通RVO(返回值优化) - 狡猾的单词“出现”,因为我无法看到这个的密闭证明,但我仍然无法看到RVO可以做到。因此,当没有返回值的情况很少,和/或效率非常重要时,最好只抛出一个异常。 C ++只支持(原始)指针和多态返回值的引用,并且使用optional
和抛出异常以指示没有返回值之间在这方面没有区别。
对于多态可选返回值,您可以使用处理所有权的智能指针,如std::unique_ptr
或std::shared_ptr
。