В чем разница между static_cast и Implicit_cast?

element = document.getElementById("elementID");
element.parentNode.removeChild(element);

У меня появилась идея из http://www.carto.net/svg/manipulating_svg_with_dom_ecmascript/

14
задан yesraaj 15 May 2009 в 14:40
поделиться

4 ответа

Я копирую из комментария, который я сделал для , ответьте на этот комментарий в другом месте.

Вы можете выполнить понижающее преобразование с помощью static_cast , Не так с implicit_cast . static_cast в основном позволяет вам выполнять любое неявное преобразование и, кроме того, обратное любому неявному преобразованию (до некоторых пределов. Преобразование невозможно, если задействован виртуальный базовый класс). Но implicit_cast будет только принимать неявные преобразования. без приведения вниз, без void * -> T * , без U-> T , если T имеет только явные конструкторы для U.

Обратите внимание, что важно отметить разницу между актерским составом и преобразованием. В дальнейшем приведение не происходит

int a = 3.4;

Но неявное преобразование происходит из double в int. Такие вещи, как «неявное приведение», не существуют, поскольку приведение всегда является явным запросом преобразования. Конструкция имени для boost :: implicit_cast представляет собой прекрасную комбинацию «приведение с использованием неявных преобразований». Теперь вся реализация boost :: implicit_cast такова (объясняется здесь ):

template<typename T> struct identity { typedef T type; };
template<typename Dst> Dst implicit_cast(typename identity<Dst>::type t)
{ return t; }

Идея состоит в том, чтобы использовать невыведенный контекст для параметра t . Это позволит избежать ловушек вроде следующего:

call_const_version(implicit_cast(this)); // oops, wrong!

Все, что хотелось бы, - это записать его вот так

call_const_version(implicit_cast<MyClass const*>(this)); // right!

Компилятор не может определить, какой тип параметра шаблона Dst следует назвать, потому что он сначала должен знать что такое identity , поскольку это часть параметра, используемого для вычета. Но это, в свою очередь, зависит от параметра Dst ( identity может быть явно специализирован для некоторых типов). Теперь у нас есть циклическая зависимость, для которой стандарт просто говорит, что такой параметр является невыведенным контекстом, и должен быть предоставлен явный аргумент-шаблон.

19
ответ дан 1 December 2019 в 12:01
поделиться

Предпочитайте implcit_cast, если этого достаточно в вашей ситуации. implicit_cast менее мощный и безопасный, чем static_cast.

Например, понижающее преобразование от базового указателя к производному указателю возможно с помощью static_cast, но не с implicit_cast. Обратное возможно в обоих случаях. Затем, при преобразовании из базового в производный класс, используйте implicit_cast, потому что это обезопасит вас, если вы перепутаете оба класса.

Также имейте в виду, что implicit_cast часто не требуется. Использование без приведения вообще работает большую часть времени, когда работает implicit_cast, отсюда и происходит «неявное». implicit_cast требуется только в особых случаях, когда необходимо точно контролировать тип выражения, например, чтобы избежать перегрузки.

4
ответ дан 1 December 2019 в 12:01
поделиться

implicit_cast transforms one type to another, and can be extended by writing implicit cast functions, to cast from one type to another.

e.g.

int i = 100;
long l = i;

and

int i = 100;
long l = implicit_cast<long>(i);

are exactly the same code

however you can provide your own implicit casts for your own types, by overloading implicit_cast like the following

template <typename T>
inline T implicit_cast (typename mpl::identity<T>::type x) 
{
    return x;
}

See here boost/implicit_cast.hpp for more

Hope this helps

EDIT

This page also talks about implicit_cast New C++

Also, the primary function of static_cast is to perform an non changing or semantic transformation from one type to another. The type changes but the values remain identical e.g.

void *voidPtr = . . .
int* intPtr = static_cast<int*>(voidPtr);

I want to look at this void pointer, as if it was an int pointer, the pointer doesn't change, and under the covers voidPtr has exactly the same value as intPtr. implicit_cast , тип изменяется, но значения после преобразования тоже могут отличаться.

1
ответ дан 1 December 2019 в 12:01
поделиться

Неявные преобразования, явные преобразования и static_cast - это разные вещи. однако, если вы можете преобразовать неявно, вы можете преобразовать явно, а если вы можете преобразовать явно, вы можете выполнить статическое преобразование. Однако то же самое в другом направлении неверно. Между неявными приведениями и статические слепки. Первое является подмножеством второго.

См. Подробности в разделе 5.2.9.3 Стандарта C ++

В противном случае выражение e может быть явно преобразован в тип T с помощью static_cast формы static_- cast (e) если объявление T t (e); правильно сформирован, для некоторых изобретенных временная переменная t (8.5).

C ++ поощряет использование static_casts, потому что это делает преобразование «видимым» в программе. Само использование приведений указывает на какое-то правило, установленное программистом, на которое стоит обратить внимание, поэтому лучше использовать static_cast.

1
ответ дан 1 December 2019 в 12:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: