+ y){
return x + y;
}
int main() {
using namespace std;
cout << summ(123, "312312312") << endl;
return 0;
}
что здесь происходит и почему это вообще компилируется?
Адресная арифметика
сумма адресов параметров?
Строка в указатель на чар преобразуется, а сложение с интим у указателя определено
https://godbolt.org/z/MoPv7PfWd auto (int, const char *) -> decltype(x + y) вот так можно сдампить кусочек AST и увидеть, какая инстанциация шаблона вызывается
И получается UB
Не получается, если ты не будешь разадресовывать полученный указатель
Суммы адресов не бывает, бессмысленная операция
А в чем UB или выход за границу без чтения/записи сам по себе UB?
Не, уже на сумме получается, увы.
(приятно советовать фичи компилятора, которые сам писал)
Да, получается невалидный адрес
что делает decltype?
преобразует выражение к его типу
declare type
тип же string
разве невалидный адрес это уже уб? а как же std::vector::end?
one past-the-end можно формировать
https://t.me/supapro/1276441 нет
кстати, __PRETTY_FUNCTION__ всегда верно отображает инстанциацию?
все равно не особо понял
Любой адрес какого-то объекта валидин только в пределах этого объекта Ну то есть вообще любой адрес должен находиться в пределах какого-то объекта объект - Это переменная языка си плюс плюс. Если у тебя допустим в памяти находится в последовательных адресах два объекта и ты каким-то образом в вышел адресом на пространство между этими двумя объектами, при условии что это пространство есть, либо адресом перешёл от одного объекта к другому объекту, то это уже некорректная операция Согласно буквы стандарта точка на практике так такое практически никогда не даёт никаких отрицательных побочных эффектов в условиях современных операционных систем. Но каких-нибудь старых операционных системах и на старых процессорах, Как пример это просто старый добрый DOS,
выход за пределы массива? или тут что-то глубже?
<dependent type> summ(X, Y) [X = int, Y = const char *] хм. ожидал что возвращаемое значение будет известно
можно вывести этот макрос внутри шаблонной функции которая приняла этот <dependent type> как аргумент)
Обсуждают сегодня