【发布时间】:2021-02-03 04:29:03
【问题描述】:
让我们来看看下面的函数声明:
void print(SomeType const* i);
这里,参数i 的const* 属性表明该参数的意图是可选,因为它可能是nullptr。如果这不是故意的,那么参数将只是一个const&。传达可选-语义当然不是设计指针的初衷,但使用它们来这样做恰好可以很好地工作很长时间。
现在,由于在现代 C++ 中通常不鼓励使用原始指针(应该避免使用 std::unique_ptr 和 std::shared_ptr 以准确指示特定的所有权-语义),我想知道如何正确指示函数参数的可选-语义不按值传递,即。 e. 复制,作为
void print(std::optional<SomeType> i);
会的。
想了一会儿,我想出了使用的想法:
void print(std::optional<SomeType const&> i);
这实际上是最准确的。但事实证明std::optionalcannot have reference types.¹
另外,使用
void print(std::optional<SomeType> const& i);
绝不会是最优的,从那时起我们将要求我们的SomeType 存在于调用者端的std::optional 中,同样可能(或而是可能)需要一份副本那里。
问题: 那么,在不复制的情况下允许可选参数的现代方法是什么?在这里使用原始指针在现代 C++ 中仍然是一种合理的方法吗?
¹:具有讽刺意味的是,std::optional 不能有引用类型的描述原因(关于重新绑定或转发分配的争议)不适用于 const 引用的std::optionals 的情况,因为他们不能被分配到。
【问题讨论】:
-
如果必须尝试
optional< reference_wrapper<T> > -
您的意思是
std::shared_ptr而不是std::smart_ptr? -
"在现代 C++ 中通常不鼓励使用原始指针" 不同意。不鼓励拥有原始指针,但非拥有指针通常没问题
-
还有
std::optional<std::cref< SomeType>>,但我只是使用SomeType*作为可选参数。 -
@MooingDuck 我想你的意思是
std::optional<std::reference_wrapper<const SomeType>>,不过。std::crefis just the helper function.
标签: c++ pointers optional semantics optional-parameters