J'ai écrit un programme pour voir, comment littéraux de chaîne de caractères ont été déduites dans les fonctions de modèle.
#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;
}
Il s'avère que, seulement pour le passByValue les littéraux de chaîne déduits à const char*
type.
Dans les deux autres cas( passByReferance y passByConstRef ), si l'on applique aux arguments déduits, std::remove_reference_t
y std::remove_const_t
ce que je suis censé obtenir est const char*
Est-ce exact ?
J'obtiens une correspondance de type lorsque je fais une désintégration complète en utilisant std::decay_t
Pourquoi ?