Согласно некоторым цитатам в стандарте:
[over.match.funcs] / 4
[...] Для функций без преобразования, представленных Используя объявление в производном классе, функция считается членом производного класса с целью определения типа параметра неявного объекта.
И рассмотрим следующий код:
#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
, почему? если я что-то пропущу в стандарте, поправьте меня.