- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
#include <iostream>
using namespace std;
int main()
{
cout << "is_same_v: " << std::is_same_v<int, const int> << endl;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
#include <iostream>
using namespace std;
int main()
{
cout << "is_same_v: " << std::is_same_v<int, const int> << endl;
}
https://en.cppreference.com/w/cpp/types/is_same
> If T and U name the same type (taking into account const/volatile qualifications), provides the member constant value equal to true. Otherwise value is false.
Модификация для C++11:
https://ideone.com/dbKiDf
int и const int с точки зрения std::is_same — разные типы.
Особенно интересно, что char — это и не signed char, и не unsigned char.
Это потому, что template variables до «C++17» (или 14, не помню) не было. Когда завезли — все подобные метафункции перевели на суффикс «_v».
> int и const int с точки зрения std::is_same — разные типы.
Ну да, это логично. Будет странно, если ты сделаешь проверку «std::is_same_v<T, int>», а потом попробуешь что-нибудь записать в переменную типа T.
Если нужно сравнить «базовые» типы — нужно просто сделать «std::remove_cv_t» на оба аргумента «std::is_same_v» (да, суффикс «_t» тоже появился из-за того, что в старых крестах не было охуительного «using T = type»). Можно даже «std::remove_reference_t» добавить, если хочется совсем-совсем базовый тип сравнить.
> Особенно интересно, что char — это и не signed char, и не unsigned char.
Ага, это мы где-то в начале года обсуждали, даже нашли, где в Стандарте такое прописано.
- я бы сказал, что это не логично, но разумно
Или в крестах это именно тип?
Спасибо.
P. S. Итого, у произвольного типа могут быть модификаторы (в общем смысле) const, volatile, & и &&. Получаем 16 кобенаций. А ведь ещё есть у-ко-ко-козатель, но он не ортогонален ссылкам. Зато константный уко-ко-ко-козатель и уко-ко-ко-козатель на константу — это тоже разные вещи, как ниже Фунтик подсказывает!
вечно не могу правильно прочитать длинные декларации, путаюсь, к чему относится const. Приходится вспомнить правило
Вот это разные типы:
Причём не просто разные, а означающие совершенно разные вещи. Первому указателю ты можешь поменять значение (var1 = 0x1234), но вот записать по нему (*var1 = 42) ничего нельзя (но если очень хочется он указывает на неконстантную пельменную, то const_cast'ом const можно отбросить и таки записать!). По второму указателю ты можешь спокойно записывать (*var2 = 42), но вот его адрес изменять нельзя (var2 = 0x1234).
Коньстантный уко-ко-козатель на коньстантные данные выглядит как «const int * const var3».
Одно из обсуждений: https://govnokod.ru/26318#comment519640.
- не могу распарсить. Мембер чего?
Членное константное значение эквивалентно истине.
У меня два варианта, как это дальше облагородить:
1. Значение членной константы — значение константы члена.
2. Константное значение члена.
Я окончательно запутался.