C++参数匹配/推导
C++ parameter match/deducing
我在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&
。
相关文章:
- 具有默认模板参数的多态类的模板推导失败
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 视图中的参数推导失败:take_while
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- variadic模板中的模板参数推导失败
- 当给定默认值时,为什么此模板参数推导失败
- 模板参数推导失败,函数参数/参数不匹配
- 类模板参数推导-clang和gcc不同
- G++ C++17 类模板参数推导在非常特殊的情况下不起作用
- 具有推导参数的模板函数指针数组变量
- C++/11 auto 关键字是在更有效时推导参数进行按引用传递,还是始终按值传递?
- 模板参数包如何同时具有显式参数和推导参数?
- 从默认参数推导参数包
- 从初始值设定项列表中推导参数
- 需要*在*用户参数之前推导参数的模板参数
- 如何从功能指针中推导参数列表
- C++模板编程/STL 推导参数
- 函数中推导参数之前的默认模板参数
- 从Template模板参数中定义并推导参数
- 推导参数'T'的冲突类型以供通用参考