2013-08-22 15 views
3

Почему мы не можем использовать ключевое слово ? Я не могу придумать ни одной веской причины не допускать этого (и несколько наоборот).Почему мы не можем сделать функции явными?

Почему это?

+4

Потому что вы не можете вызвать функции неявно в любом случае? (Edit - ну, конечно, конструкторы с одним аргументом и операторы преобразования в любом случае являются функциями, но вы знаете, что я имею в виду. «Нормальные» функции) – BoBTFish

+3

Можете ли вы объяснить, что вы ожидаете, если вы объявите произвольную функцию как «явную»? 'explicit 'предотвращает неявные преобразования, как это применимо здесь? – nijansen

+0

@nijansen Я бы этого не ожидал (http://ideone.com/mtbfsE) – user1233963

ответ

6

То, что вы хотите достичь (запретить преобразование типа для ваших аргументов функции) может быть легко достигнуто путем объявления удаленной версии шаблона функции:

template <class T> void f(T) = delete; 

void f(int){} 

int main() 
{ 
    double k = 4; 
    f(k); //error: use of deleted function ‘void f(T) [with T = double]’ 
} 
+0

Без C++ 11 вы можете создать шаблон 'f' и только реализовать требуемую специализацию. –

+0

@BenjaminBannier, который работает только для одного аргумента, потому что вы не можете частично специализировать функции до C++ 11;) – nijansen

+0

@BenjaminBannier вы можете * перегружать * шаблон и просто не определять его вообще - однако вы получите ошибки компоновщика вместо более прямая ошибка «удаленной функции». –

0

explicit используется для указания того, что функция не может используется для выполнения неявного преобразования типов. Поскольку преобразования типов могут выполняться только с использованием конструкторов и операторов преобразования (например, operator int()), explicit имеет смысл только при применении к ним.

Историческое примечание: до 2011 года оно не могло применяться к операторам преобразования; это широко расценивалось как недостаток, который был исправлен.

Смежные вопросы