Я написал программу, чтобы увидеть, как строковые литералы выводятся в шаблонных функциях.
#include <iostream>
#include <string>
#include <type_traits>
template<typename T> void passByValue(T by_value)
{
std::cout << std::is_same_v<char const*, decltype(by_value)> << std::endl; // okay
}
template<typename T> void passByReferance(T &by_ref)
{
std::cout << std::is_same_v<char const*, std::remove_reference_t<decltype(by_ref)>> << std::endl;
}
template<typename T> void passByConstRef(const T &const_ref)
{
std::cout << std::is_same_v<char const*, std::remove_const_t<std::remove_reference_t<decltype(const_ref)>>> << std::endl;
}
int main()
{
std::cout << std::boolalpha;
passByValue("string"); // true: good
passByReferance("string");// false ??
passByConstRef("string"); // false ??
return 0;
}
Оказывается, что только для passByValue строковые литералы выводятся в тип const char*
.
В двух других случаях ( passByReferance и passByConstRef ), если мы применим к выведенным аргументам, std::remove_reference_t
и std::remove_const_t
, что мы предполагаем получитьэто const char*
, это правильно?
Я получаю совпадение типов, когда завершаю распад, используя std::decay_t
, почему это так?