Size: a a a

2020 September 01

АК

Александр Караев... in pro.cxx
Neargye
const char p[] = "Vivisectionist";
X<std::string_view, p> y;
string_view не считается structural type
источник

АК

Александр Караев... in pro.cxx
в частности потому что у него не all members public
источник

VR

Vladyslav Ryuzaki in pro.cxx
Neargye
const char p[] = "Vivisectionist";
X<std::string_view, p> y;
Так ты передаешь указатель
источник

D

Danya in pro.cxx
Neargye
const char p[] = "Vivisectionist";
X<std::string_view, p> y;
p не строковый литерал
источник

D

Danya in pro.cxx
Vladyslav Ryuzaki
Последняя строка в примере, он про это может
Там A inplace конструируется
И, я думаю, если A будет сохранять указатель на строковый литерал, то это UB
источник

D

Danya in pro.cxx
Потому что оно будет refer to string literal object
источник

VR

Vladyslav Ryuzaki in pro.cxx
Danya
Там A inplace конструируется
И, я думаю, если A будет сохранять указатель на строковый литерал, то это UB
Я к тому, что с fixed_string можно юзать шаблоны со строковым литералом
источник

D

Danya in pro.cxx
Vladyslav Ryuzaki
Я к тому, что с fixed_string можно юзать шаблоны со строковым литералом
с fixed_string — конечно
Там просто будет внутренний массивчик и всё, в который будет копироваться содержимое литерала
источник

VR

Vladyslav Ryuzaki in pro.cxx
Danya
с fixed_string — конечно
Там просто будет внутренний массивчик и всё, в который будет копироваться содержимое литерала
Ну да, просто этого давно не хватало) приходилось делать чейны из чаров и т.д.
источник

АК

Александр Караев... in pro.cxx
Побитый Кирпич
Интересно откуда требование на all public
Там изначально было совсем иначе, в последний момент всё поменяли (успели, к счастью). Думаю, в будущем придумают, как без компиляторного УБ снять остальные ограничения
источник

ПК

Побитый Кирпич... in pro.cxx
Александр Караев
Там изначально было совсем иначе, в последний момент всё поменяли (успели, к счастью). Думаю, в будущем придумают, как без компиляторного УБ снять остальные ограничения
Дак а чем ограничение на all public вызвано?
источник

АК

Александр Караев... in pro.cxx
Побитый Кирпич
Дак а чем ограничение на all public вызвано?
Это длинная история, попробую рассказать покороче..
источник

N

Neargye in pro.cxx
Danya
Там A inplace конструируется
И, я думаю, если A будет сохранять указатель на строковый литерал, то это UB
в компиле-тайм все что УБ запрещено
поэтому гсс выдает (на удивление) читаемую ошибку
https://godbolt.org/z/aqzG91
источник

N

Neargye in pro.cxx
Danya
Ля там же явно написано:
A string-literal ([lex.string]) is not an acceptable template-argument for a template-parameter of non-class type.
эх, финальная версия nttp чот вышла не оч, а по проползам она мне нравилась больше
источник

АК

Александр Караев... in pro.cxx
В чем вообще проблема NTTP параметров?

Рассмотрим простую функцию template <T value> void f();

До C++20 в качестве T мог выступать один из небольшого множества типов. Особенность этого множества состояла в том, что можно два объекта типа T сравнить, убедиться в их эквивалентности. В частности, f<2> и f<1+1> оказывались одинаковыми инстанцированиями, так как 2==1+1. А ещё от них от всех можно посчитать хеш по алгоритму, выбранному компилятором.

Теперь допустим, что мы хотим сделать T = std::string (допустим также, что строка у нас уже вся обмазана constexpr). Как компилятору проверить, что f<std::string("1")> и f<std::string("1")> - это одна и та же функция? Логично, что для этого он должен уметь сравнивать в constexpr строки. Более того, так как шаблоны кэшируются, то очень хорошо бы ещё уметь и хешировать такие параметры (хеш-таблица быстрее дерева). То есть при инстанцировании очередной f<some_string> компилятор должен поискать среди уже проинстанцированных f<..> такую же.

Это приводит к необходимости делать подобие constexpr hash + constexpr operator<=>, который должен быть написан автором типа T (std::string или какой-то used-defined). Здесь и засада. Пользователь может написать некорректную реализацию, что приведёт к UB при компиляции, которое невозможно диагностировать. Что просто сломает компилятор.

Поэтому решили сделать требования типа all public и прочее - компилятор считает такие типы просто последовательностью более примитивных типов, от которых он умеет считать хеш и сравнивать.
источник

ПК

Побитый Кирпич... in pro.cxx
Александр Караев
В чем вообще проблема NTTP параметров?

Рассмотрим простую функцию template <T value> void f();

До C++20 в качестве T мог выступать один из небольшого множества типов. Особенность этого множества состояла в том, что можно два объекта типа T сравнить, убедиться в их эквивалентности. В частности, f<2> и f<1+1> оказывались одинаковыми инстанцированиями, так как 2==1+1. А ещё от них от всех можно посчитать хеш по алгоритму, выбранному компилятором.

Теперь допустим, что мы хотим сделать T = std::string (допустим также, что строка у нас уже вся обмазана constexpr). Как компилятору проверить, что f<std::string("1")> и f<std::string("1")> - это одна и та же функция? Логично, что для этого он должен уметь сравнивать в constexpr строки. Более того, так как шаблоны кэшируются, то очень хорошо бы ещё уметь и хешировать такие параметры (хеш-таблица быстрее дерева). То есть при инстанцировании очередной f<some_string> компилятор должен поискать среди уже проинстанцированных f<..> такую же.

Это приводит к необходимости делать подобие constexpr hash + constexpr operator<=>, который должен быть написан автором типа T (std::string или какой-то used-defined). Здесь и засада. Пользователь может написать некорректную реализацию, что приведёт к UB при компиляции, которое невозможно диагностировать. Что просто сломает компилятор.

Поэтому решили сделать требования типа all public и прочее - компилятор считает такие типы просто последовательностью более примитивных типов, от которых он умеет считать хеш и сравнивать.
Это не объясняет почему нельзя сделать "all private"
источник

ПК

Побитый Кирпич... in pro.cxx
Компилятор точно так же пройдет по всем мемберам
источник

P

PRoSToC0der in pro.cxx
Александр Караев
В чем вообще проблема NTTP параметров?

Рассмотрим простую функцию template <T value> void f();

До C++20 в качестве T мог выступать один из небольшого множества типов. Особенность этого множества состояла в том, что можно два объекта типа T сравнить, убедиться в их эквивалентности. В частности, f<2> и f<1+1> оказывались одинаковыми инстанцированиями, так как 2==1+1. А ещё от них от всех можно посчитать хеш по алгоритму, выбранному компилятором.

Теперь допустим, что мы хотим сделать T = std::string (допустим также, что строка у нас уже вся обмазана constexpr). Как компилятору проверить, что f<std::string("1")> и f<std::string("1")> - это одна и та же функция? Логично, что для этого он должен уметь сравнивать в constexpr строки. Более того, так как шаблоны кэшируются, то очень хорошо бы ещё уметь и хешировать такие параметры (хеш-таблица быстрее дерева). То есть при инстанцировании очередной f<some_string> компилятор должен поискать среди уже проинстанцированных f<..> такую же.

Это приводит к необходимости делать подобие constexpr hash + constexpr operator<=>, который должен быть написан автором типа T (std::string или какой-то used-defined). Здесь и засада. Пользователь может написать некорректную реализацию, что приведёт к UB при компиляции, которое невозможно диагностировать. Что просто сломает компилятор.

Поэтому решили сделать требования типа all public и прочее - компилятор считает такие типы просто последовательностью более примитивных типов, от которых он умеет считать хеш и сравнивать.
у тебя опечатка: вместо f<1+2> должно быть f<1+1>
источник

АК

Александр Караев... in pro.cxx
PRoSToC0der
у тебя опечатка: вместо f<1+2> должно быть f<1+1>
спасибо
источник

АК

Александр Караев... in pro.cxx
Побитый Кирпич
Компилятор точно так же пройдет по всем мемберам
потому что сейчас std::string может выглядеть как const char* ptr; std::size_t cap, len;
какой толк компилятору сравнивать указатели или capacity?
источник