Остановка функции неявного преобразования - PullRequest
5 голосов
/ 05 января 2011

Сегодня я столкнулся со странной ситуацией, когда мне нужна была функция для неявного преобразования значений.

После некоторого просмотра в Google я нашел это http://www.devx.com/cplus/10MinuteSolution/37078/1954

Но я подумал, что было бы немного глупо использовать перегрузку функций для каждого другого типа, который я хочу заблокировать, поэтому вместо этого я сделал это.

<code>
void function(int& ints_only_please){}</p>

<p>int main()
{
    char a=0;
    int b=0;
    function(a);
    function(b);
}

Я показал код другу, и он предложил добавить const перед int, чтобы переменная не редактировалась, однако, когда я начал компилировать нормально, но не должен, посмотрите ниже, чтобы понять, что я имею в виду

<code>
void function(const int& ints_only_please){}</p>

<p>int main()
{
    char a=0;
    int b=0;
    function(a); //Compiler should stop here but it doesn't with const int
    function(b);
}

Кто-нибудь знает, почему это так?

Ответы [ 2 ]

14 голосов
/ 05 января 2011

Используйте шаблоны для получения желаемого эффекта:

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, так что вызов, имеющий любой другой тип в качестве параметра шаблона, приведет кв ошибке компиляции.

7 голосов
/ 05 января 2011

Допустимо привязывать временную ссылку к const, но не к ссылке const.

A char может быть неявно преобразовано в int, и временное значение, являющееся результатом этого преобразования, может быть привязано к параметру функции const int&, продлевающему время жизни временного объекта до выхода из функции.

...