【发布时间】:2020-07-19 11:18:15
【问题描述】:
根据标准中的一些引号:
[over.match.funcs]/4
[...] 对于通过 using 声明引入派生类的非转换函数,为了定义隐式对象参数的类型,该函数被认为是派生类的成员。
并考虑以下代码:
#include <iostream>
struct Base {
void show(double) {
std::cout << "0" << std::endl;
}
};
struct Test :Base {
using Base::show; //#1
void show(double) { //#2
std::cout << "1" << std::endl;
}
};
int main() {
Test t;
t.show(1.2);
}
根据我引用的标准,这意味着将Test类型的隐含对象参数作为#1的类型。
对于#1,声明为show(Test&,double)。
对于#2,声明为show(Test&,double)。
所以为了重载解析,#1的每个隐式转换序列与#2的隐式转换序列没有区别,t.show(1.2)的调用会模棱两可,但是#2被调用了,为什么?如果我错过了标准中的某些内容,请纠正我。
【问题讨论】:
标签: c++ language-lawyer using-declaration