Я написал программу, чтобы увидеть, как строковые литералы выводятся в шаблонных функциях.
#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
, почему?