2014-11-20 2 views
3

Мне было интересно, имеет ли смысл использовать std::forward<> при отправке экземпляра в typeid?Имеет ли смысл использовать std :: forward с оператором typeid?

template <typename T> 
void foo(T&& value) { 
    std::cout << typeid(std::forward<T>(value)).name() << std::endl; 
} 

ли применение typeid(value) вместо дает тот же результат?

+0

Почему это имеет смысл? Почему бы вам просто не попытаться скомпилировать его? –

+1

@JonathanWakely Просто компиляция показывает, что существует много случаев, когда использование 'std :: forward' дает тот же результат, что и не его использование, но не может быть окончательно доказано, что он даст тот же результат во всех случаях. – hvd

+0

Итак, вы пишете шаблон функции, подобный приведенному выше, и набрасываете на него нагрузку типов. Несколько встроенных типов, нетривиальный тип класса, указатель и т. Д., И вы можете получить довольно хорошую идею. Первый вопрос остается, почему это имеет смысл? 'typeid' не является функцией, он не копирует свой операнд. Кроме того, он существовал в C++ 03, когда 'forward' не существовал, поэтому очевидно, что' forward' не требуется, чтобы дать ему правильный ответ. –

ответ

5

От [expr.typeid]/3:

Когда typeid применяется к выражению, кроме glvalue определенного типа полиморфного класса, результат относится к std::type_info объект, представляющий статический тип выражение.

В стандарте C++ «тип выражения» никогда не является ссылочным типом; «ссылочная характеристика» (значение lvalue или rvalue) выражения выражается в его категории . Поскольку std::forward не изменяет тип выражения, только его категория значений (например, от lvalue до rvalue), применяя std::forward, не повлияет на результат typeid.

3

Нет, это не так. Результат будет таким же.

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