У меня есть шаблон структуры, который принимает два типа (T
и S
) и в какой-то момент использует static_cast
для преобразования из одного типа в другой. Часто бывает так, что T
и S
относятся к одному и тому же типу.
Упрощенный пример настройки:
template <typename T, typename S = T>
struct foo
{
void bar(T val)
{
/* ... */
some_other_function(static_cast<S>(val));
/* ... */
}
};
В случае, если S
является тем же классом, что и T
, может ли static_cast
вводить дополнительные накладные расходы, или это нулевая операция, которая всегда будет игнорироваться?
Если это приводит к накладным расходам, есть ли простой прием метапрограммирования шаблонов для выполнения static_cast
только в случае необходимости, или мне нужно будет создать частичную специализацию, чтобы справиться со случаем T == S
? Я бы предпочел по возможности избегать частичной специализации всего шаблона foo
.
int a = 5; int b = static_cast<int>(a);
) - person Jonathan Potter   schedule 01.10.2013std::string
? Например, если аргументsome_other_function
равенconst std::string&
, гарантированно ли будет передана ссылка наval
, а не на временную копиюval
? - person marack   schedule 01.10.2013some_other_function
,bar
и т. д. и передачи по значению. Не от самогоstatic_cast
. - person Jonathan Potter   schedule 13.05.2016t2 = static_cast<T>(t1)
сначала вызывает конструктор копирования (чтобы сделать безымянное временное), а затем оператор присваивания, когда все имеет типT
. Это не то же самое, чтоt2 = t1
(который просто вызывает оператор присваивания). Действительно, стандарт указывает, чтоstatic_cast<T>(t1)
идентично объявлениюT temp(t1)
(гдеtemp
на самом деле является безымянной переменной), а выражение имеет значениеtemp
. - person Nick Matteo   schedule 13.05.2016