2013-09-10 2 views
0

Какой тип может быть отлит? указатели, числовые вары. Любые другие? Будут ли следующие листы безопасными?static_cast literal 0 для других типов в STL

пс: выдержка из реализации STL итераторов

template <class Iterator> 
inline typename iterator_traits<Iterator>::difference_type* 
distance_type(const Iterator&) { 
    return static_cast<typename iterator_traits<Iterator>::difference_type*>(0); 
} 

template <class Iterator> 
inline typename iterator_traits<Iterator>::value_type* 
value_type(const Iterator&) { 
    return static_cast<typename iterator_traits<Iterator>::value_type*>(0); 
} 
+0

"Безопасный" ?! Он даже компилируется? –

+0

Ну, это, конечно, не будет, если выбрано 'value_type'. '0' может быть применено к указателям и цифрам, вот и все. – filmor

+1

Оба эти приведения являются указателями, а указатели могут быть NULL, так что да. –

ответ

1

Все виды указателей, включая указатель на функцию, указатель на член, указатель на член-функции; арифметические типы; все с конструкцией 1-arg int; что-либо с конструктором 1-arg, использующим тип, который 0 может быть неявно преобразован в. Наверное, что-то еще я не думал.

Предполагая, что iterator_traits решает std::iterator_traits, затем typename iterator_traits<Iterator>::difference_type*, конечно, тип указатель на объект, кроме, возможно, в программе, которая имеет неверную специализацию iterator_traits. Так что да, литье работает.

Если вы перепутали и определили difference_type или value_type в качестве ссылочного типа или вообще не являетесь типом, тогда у вас возникнут проблемы с этим кодом.

+1

'void', тоже. Я думаю, что «арифметика» плюс «void» вместе - это «основные типы». – MSalters

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

  • Нет связанных вопросов^_^