Результат для кода ниже:
void doit(const T1 &, const T2 &) [T1 = unsigned long, T2 = int]
t1 == t2
t1 == (T1)t2
t1 != (T1&)t2
t1 == (T1&&)t2
Я понимаю, что случай t1 == t2
- это просто интегральная акция.
Второй случай t1 == (T1)t2
- это одно и то же, просто явное.
Третий случай t1 == (T1&)t2
должен быть каким-то образом reinterpret_cast
... Хотя, дальнейшее объяснение было бы полезно.
Четвертый случай t1 == (T1&&)t2
- это то, что я застрял. Я включил термин "временная материализация" в заголовок вопроса, так как это самое близкое, что я могу прийти к какому-то ответу.
Может ли кто-то пройти эти четыре случая?
Код:
#include <iostream>
template <typename T1, typename T2>
void doit(const T1& t1, const T2& t2) {
std::cout << __PRETTY_FUNCTION__ << '\n';
if (t1 == t2) {
std::cout << "t1 == t2" << '\n';
}
else {
std::cout << "t1 != t2" << '\n';
}
if (t1 == (T1)t2) {
std::cout << "t1 == (T1)t2" << '\n';
}
else {
std::cout << "t1 != (T1)t2" << '\n';
}
if (t1 == (T1&)t2) {
std::cout << "t1 == (T1&)t2" << '\n';
}
else {
std::cout << "t1 != (T1&)t2" << '\n';
}
if (t1 == (T1&&)t2) {
std::cout << "t1 == (T1&&)t2" << '\n';
}
else {
std::cout << "t1 != (T1&&)t2" << '\n';
}
}
int main() {
const unsigned long a = 1;
const int b = 1;
doit(a, b);
return 0;
}