【发布时间】:2021-11-26 19:11:51
【问题描述】:
假设我们有这个作为我们的设置:
#include <iostream>
class Base {
private:
int a;
public:
Base(int a)
: a(a) {
}
virtual void print() = 0;
};
class Child : public Base {
public:
using Base::Base;
void print() override {
//some code
}
};
class Wrapper {
private:
void* base_ptr = nullptr;
public:
Wrapper(void* base_ptr)
: base_ptr(base_ptr) {
std::cout << "void* version called\n";
}
Wrapper(Base* const& base_ptr)
: base_ptr(base_ptr) {
std::cout << "Base*const& version called\n";
}
};
如果我们执行以下操作:
Child* child_ptr = new Child(1);
Wrapper w(child_ptr);
输出是:
Base*const& version called
这是意料之中且完全正常的。
但如果我们将Wrapper(Base *const&) 更改为Wrapper(Base*&),我们将调用void* 版本:
class Wrapper {
private:
void* base_ptr = nullptr;
public:
Wrapper(void* base_ptr)
: base_ptr(base_ptr) {
std::cout << "void* version called\n";
}
Wrapper(Base*& base_ptr)
: base_ptr(base_ptr) {
std::cout << "Base*const& version called\n";
}
};
int main() {
Child* child_ptr = new Child(1);
Wrapper w(child_ptr);
return 0;
}
对于这个版本,我们得到这个输出:
void* version called
但这是为什么呢? Base*const& 不应该让它也兼容临时对象吗?
【问题讨论】:
标签: c++ constructor overload-resolution