我有一个问题,关于何时从下面给出的代码片段的角度调用C ++中的复制构造函数:
bool do_stuff(int a, int b, char *c, Uid key = 0);
此处key
是do_stuff()
class Uid {
...
...
private:
u_char data_[UID_LENGTH];
}
现在,Uid
有这些构造函数:
Uid:Uid()
{
memset(data_, 0, UID_LENGTH);
}
/// @brief Copy construct a uid
Uid::Uid(const Uid &id)
{
memcpy(data_, id.data_, UID_LENGTH);
}
/// @brief Copy the contents of ptr as the contents of a new Uid
Uid::Uid(const u_char* ptr)
{
memcpy(data_, ptr, UID_LENGTH);
}
/// @brief Set the contents of a Uid with provided values
Uid::Uid(u_int64_t high, u_int64_t low)
{
…
…
}
当使用三个参数调用do_stuff
时,将调用Uid::Uid(const u_char* ptr)
来为key
创建对象。是否由于缺少选择Uid::Uid(const u_char* ptr)
的更好匹配?
将原型更改为......
bool do_stuff(int a, int b, char *c, Uid key = (Uid)0);
...确保调用Uid::Uid(const Uid &id)
?
谢谢!
答案 0 :(得分:1)
您可能想要
bool do_stuff(int a, int b, char *c, Uid key = Uid{});
这样,如果用三个输入参数调用do_stuff
,将调用默认构造函数。
答案 1 :(得分:0)
在制作默认的Uid参数时,允许编译器忽略复制构造函数。要看到这一点,请使用-fno-elide-constructors
重新编译您的程序(假设是g ++)以查看差异。
关于Uid::Uid(char const*)
构造函数, 是0
的最佳匹配,因为当您当前没有构造函数时它仍可用作nullptr
标量值。