Остановка функции неявное преобразование
-
25-09-2019 - |
Вопрос
Сегодня я наткнулся на странную ситуацию, где мне нужна функция, чтобы не косвенно преобразовать значения.
После того, как некоторые смотрят на Google я нашел это http://www.devx.com/cplus/10minuteution/37078/1954.
Но я подумал, что это немного глупо использовать функцию перегрузки для каждого другого типа, которую я хочу заблокировать, поэтому я сделал это.
void function(int& ints_only_please){}
int main () {char a = 0; int b = 0; Функция (а); Функция (б); }
Я показал код другу, и он предложил, я добавил const, прежде чем int, поэтому переменная не редактирована, однако, когда я начал компилировать штраф, но не стоит, смотреть ниже, чтобы увидеть, что я имею в виду
void function(const int& ints_only_please){}
int main () {char a = 0; int b = 0; Функция (а); // Компилятор должен остановиться здесь, но он не с функцией const int (b); }
Кто-нибудь знает, почему это?
Решение
Используйте шаблоны, чтобы получить желаемый эффект:
template <class T>
void foo(const T& t);
template <>
void foo<int>(const int& t)
{
}
int main(){
foo(9); // will compile
foo(9.0); // will not compile
return 0;
}
Обратите внимание, что мы пишем только специальную версию шаблона для int
Так что звонок, который имеет какой-либо другой тип в качестве параметра шаблона, приведет к ошибке компиляции.
Другие советы
Законно связать временный const
ссылка, но неconst
ссылка.
А. char
может быть неявно преобразован в int
и временный результат этого преобразования может быть связан с const int&
Функциональный параметр, распространяющий время жизни временного действия до выходов.