- 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.
Funtik 17.08.2020 18:11 # 0
Модификация для C++11:
https://ideone.com/dbKiDf
int и const int с точки зрения std::is_same — разные типы.
Особенно интересно, что char — это и не signed char, и не unsigned char.
gost 17.08.2020 19:16 # +2
Это потому, что 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.
Ага, это мы где-то в начале года обсуждали, даже нашли, где в Стандарте такое прописано.
gostinho 17.08.2020 19:18 # 0
bormand 17.08.2020 19:23 # +2
Funtik 17.08.2020 19:23 # −1
Desktop 17.08.2020 19:28 # 0
gostinho 17.08.2020 19:36 # +1
Desktop 17.08.2020 19:37 # 0
Funtik 18.08.2020 03:53 # 0
Desktop 17.08.2020 19:24 # 0
- я бы сказал, что это не логично, но разумно
gost 17.08.2020 19:26 # 0
Desktop 17.08.2020 19:27 # 0
Или в крестах это именно тип?
gost 17.08.2020 19:30 # 0
Desktop 17.08.2020 19:32 # 0
Спасибо.
gostinho 17.08.2020 19:34 # 0
gost 17.08.2020 19:35 # +3
P. S. Итого, у произвольного типа могут быть модификаторы (в общем смысле) const, volatile, & и &&. Получаем 16 кобенаций. А ведь ещё есть у-ко-ко-козатель, но он не ортогонален ссылкам. Зато константный уко-ко-ко-козатель и уко-ко-ко-козатель на константу — это тоже разные вещи, как ниже Фунтик подсказывает!
MAKAKA 18.08.2020 04:17 # 0
вечно не могу правильно прочитать длинные декларации, путаюсь, к чему относится const. Приходится вспомнить правило
Funtik 18.08.2020 04:44 # 0
Funtik 17.08.2020 19:31 # +1
Вот это разные типы:
gost 17.08.2020 19:38 # +1
Причём не просто разные, а означающие совершенно разные вещи. Первому указателю ты можешь поменять значение (var1 = 0x1234), но вот записать по нему (*var1 = 42) ничего нельзя (но если очень хочется он указывает на неконстантную пельменную, то const_cast'ом const можно отбросить и таки записать!). По второму указателю ты можешь спокойно записывать (*var2 = 42), но вот его адрес изменять нельзя (var2 = 0x1234).
Коньстантный уко-ко-козатель на коньстантные данные выглядит как «const int * const var3».
Desktop 17.08.2020 19:40 # 0
gost 17.08.2020 19:44 # 0
gost 17.08.2020 19:26 # 0
Одно из обсуждений: https://govnokod.ru/26318#comment519640.
Desktop 17.08.2020 19:25 # 0
- не могу распарсить. Мембер чего?
gost 17.08.2020 19:28 # +2
Funtik 17.08.2020 19:29 # 0
Членное константное значение эквивалентно истине.
У меня два варианта, как это дальше облагородить:
1. Значение членной константы — значение константы члена.
2. Константное значение члена.
Я окончательно запутался.
gost 17.08.2020 19:32 # +1