C++参数匹配/推导

C++ parameter match/deducing

本文关键字:推导 参数 C++      更新时间:2023-10-16

我在Android Oreo源代码中阅读了一些我不太理解的代码。

首先,类 IOMXNode有一个函数:

class IOMXNode : public IInterface {
public:
+-- 46 lines: DECLARE_HYBRID_META_INTERFACE(OMXNode, IOmxNode);-------------------------------------------------------------------------------------------------------------------------------
// Instructs the component to use the buffer passed in via |omxBuf| on the
// specified port. Returns in |*buffer| the buffer id that the component
// assigns to this buffer. |omxBuf| must be one of:
// 1) OMXBuffer::sPreset for meta-mode,
// 2) type kBufferTypeANWBuffer for non-meta-graphic buffer mode,
// 3) type kBufferTypeSharedMem for bytebuffer mode.
virtual status_t useBuffer(
OMX_U32 port_index, const OMXBuffer &omxBuf, buffer_id *buffer) = 0;

useBuffer((有三个参数,其中一个是const OMXBuffer&,它定义如下:

class OMXBuffer {
public:
// sPreset is used in places where we are referring to a pre-registered
// buffer on a port. It has type kBufferTypePreset and mRangeLength of 0.
static OMXBuffer sPreset;
// Default constructor, constructs a buffer of type kBufferTypeInvalid.
OMXBuffer();
// Constructs a buffer of type kBufferTypePreset with mRangeOffset set to
// |codecBuffer|'s offset and mRangeLength set to |codecBuffer|'s size (or 0
// if |codecBuffer| is NULL).
OMXBuffer(const sp<MediaCodecBuffer> &codecBuffer);
// Constructs a buffer of type kBufferTypePreset with specified mRangeOffset
// and mRangeLength.
OMXBuffer(OMX_U32 rangeOffset, OMX_U32 rangeLength);
// Constructs a buffer of type kBufferTypeSharedMem.
OMXBuffer(const sp<IMemory> &mem);

然后在某处调用此函数,例如:

sp<IOMXNode> mOMXNode;
...
sp<IMemory> mem;
...
err = mOMXNode->useBuffer(portIndex, mem, &info.mBufferID);

那么,为什么sp<IMemory>可以直接匹配函数useBuffer((的第二个参数类型const OMXBuffer&呢?

我所能做的只是以某种方式,编译器使用sp<IMemory>并构造一个OMXBuffer,然后匹配useBuffer((第二个参数。

这是属于类型的推断还是我不知道的其他东西?

重要的行是这些(来自OMXBuffer类(:

// Constructs a buffer of type kBufferTypeSharedMem.
OMXBuffer(const sp<IMemory> &mem);

转换构造函数使得从sp<IMemory>对象创建OMXBuffer对象成为可能。

这意味着真正发生的事情是

err = mOMXNode->useBuffer(portIndex, OMXBuffer(mem), &info.mBufferID);

也就是说,从mem对象创建临时OMXBuffer对象。然后将对该临时OMXBuffer对象的引用传递给useBuffer函数。一旦useBuffer函数返回临时OMXBuffer对象就会被破坏。

当仅使用一个参数定义复制构造函数时,它是一个转换构造函数。

来自 cpp 参考

据说转换构造函数指定从其参数类型(如果有(到其类类型的隐式转换

因此,当您传递mem以使用 Buffer 作为第二个参数时,它将通过使用转换构造函数转换为OMXBuffer&