C ++参数匹配/推理

时间:2018-06-04 06:08:59

标签: android c++

我读了一些我在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&amp;

所有我可以将它放在一起的方式是,编译器使用sp<IMemory>并构造 OMXBuffer ,然后匹配 useBuffer()第二个参数。

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

2 个答案:

答案 0 :(得分:2)

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

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

converting constructor可以从OMXBuffer对象创建sp<IMemory>对象。

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

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

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

答案 1 :(得分:0)

如果只使用一个参数定义了复制构造函数,那么它就是转换构造函数。

来自cpp reference

  

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

因此,当您将mem传递给useBuffer作为第二个参数时,使用转换构造函数将其转换为OMXBuffer&