же UB получается?
struct S {
int x = 1;
int &r = x;
void f(int y) const {
r = y;
}
};
int main() {
S s;
s.f(2);
std::cout << s.x; // -> 2
return 0;
}
Не уб, потому что S не декларирована как константная
Аа.. Табуляция
Ну это уб
при попадании в константный метод поведение эквивалентно константному объекту
Нет, что посетили константным, то и является
Ссылка меняется? Нет. Значит корректно
так само поле в константном методе является константным на момент обращения
На момент обращения язык и компилятор уже ничего не знают о том куда указывает ссылка
окей, я изменил на const, но вопрос тот же
получается УБ, да?
https://t.me/ProCxx/600058
я исправил на const. Что в таком случае?
Если константа, то уб, проверить элементарно, добавить constexpr
Да, с constexpr всё и в правду ломается. Спасибо
осуждать табы по 4, мда
У тебя 4, у кого-то 8 или 2
https://eao197.blogspot.com/2023/08/progc-nrvorvo-ub.html?m=1 Есть еще вот такой занятный ногострел из этой же серии.
Ага, mutable не нужен...
Это любопытное и скорее всего заслуживает репорта: кажется, что сейчас нет однозначности относительно того, какой тип у объекта в этом случае в части cv-квалификаторов, поскольку NRVO позволяет элиасинг сквозь них и не указывается, тип какого из конфликтующих определений брать для итогового объекта, если не ошибаюсь.
Там табов вообще не было, лол
да, и теперь это нужно осуждать
Это точно UB? clang-tidy не ругается, PVS-Studio не ругается, Sonar не ругается, если добавить constexpr к f — ничего не падает, всё работает так же хорошо
Там, кстати, функцию можно убрать и сделать просто s.r = 2;
https://godbolt.org/z/PbcG5c9o4
А это точно говорит об UB? Мне кажется, это не является constant expression не из-за того, что это UB, а из-за [expr.const#5.16] 5. An expression E is a core constant expression unless the evaluation of E, following the rules of the abstract machine ([intro.execution]), would evaluate one of the following:... 5.16 a modification of an object ([expr.ass], [expr.post.incr], [expr.pre.incr]) unless it is applied to a non-volatile lvalue of literal type that refers to a non-volatile object whose lifetime began within the evaluation of E;
Изменение константного объекта — это ub. В твоём примере нет ub, потому что нет изменения константного объекта. static member не связан ни с одним из экземпляров и их константностью.
Обсуждают сегодня