Постироничные идеи для ебаного C++
553 subscribers
60 photos
2 videos
2 files
23 links
Download Telegram
Мы долго не выпускали новые авторские посты, потому что готовили proposal. По секрету скажу, что мы близки к принятию его в C++29.
👍10🐳1
@ БОЛЬШАЯ ЧАСТЬ ОШИБОК И УЯЗВИМОСТЕЙ ИМЕЮТ ПОД СОБОЙ BUFFER OVERFLOW
@ ДАВАЙТЕ ПЕРЕЙДЕМ НА MEMORY SAFE ЯЗЫК
@ КАЗАЛОСЬ БЫ #антибугурт
*пикрелейтед*
https://blog.cloudflare.com/18-november-2025-outage/
1🔥26👍1
Наконец-таки мы додумались до ссылок которые могут быть нулями

https://wg21.link/P2988
😁16🔥3❤1👍1🥰1🫡1
Forwarded from IFNDR Club
👍21🤩5😁3❤2
Время пятничного зачилла пришло с запозданием и не в тот паблик.

Надеюсь, все уже знакомы с P2806 do expressions. Я бумагу пока даже не открывал. Поговорим про очевидный прародитель и этого предложения, и похожих конструкций в разных языках. Statement expressions в GNU C позволяют писать compound statement там, где нужен expression. В случае C на этом их описание практически заканчивается.

Итак, тип и значение полученного выражения берётся из последнего statement внутри скобок, если это выражение...
int x = ({
int sum = 0;
for(int i = 1; i <= 10; ++i)
sum += i;
sum;
});
// x = 55

...причём вывод типа похож на ->auto, и на это не повлиять.
int i = 0, &ri = i;
// decltype(({ ri; })) = int
// decltype(({ (int&&)i; })) = int

Guaranteed copy elision работает, но аналога RVO нет.
struct immobile { immobile(); immobile(immobile&&)=delete; };
struct moveonly { moveonly(); moveonly(moveonly&&)=default; };
auto x = ({ immobile(); }); // ok since C++17
auto y = ({ moveonly m; m; }); // error: call to deleted copy ctor


Но то всё мелочи. Сабж выгодно отличается от замыканий возможностью control flow, влияющего на содержащую функцию:
while(1)
while(({ break; // gcc: breaks outer loop
// clang: breaks inner loop
1; }));

goto внутрь делать нельзя, но можно наружу, в том числе вниз:
auto v = ({
goto out;
std::vector<int>();
});
out:
// The usual error "jump crosses initialization of v"
// does NOT happen. v is uninitialized.
// Its destructor will probably crash.


...Если вы ещё не забыли, у нас тот самый пятничный зачилл. Есть малозначительные разногласия по поводу того, где сабж в принципе разрешён.
int i = ({1;});     // error: never ok outside functions
decltype(({1;})) i; // error: ...even in unevaluated context

struct foo {
decltype(({1;})) i;
// error: again, never ok outside functions.
// gcc emits disappointing but correct message
// clang complains about file scope even though it's not
};

int main() {
std::integral_constant<int,
({ 1; }) // gcc: error
// clang: ok (as long as inside function)
>{};
}

Чтобы не думалось, что clang нам сегодня компилирует строго больше кода:
constexpr int i = ({ int j = 0; j; });
// gcc: ok
// clang: error (j is not a constant expression)


В комметарии приглашаются мнения по поводу того, кто в каком случае прав и если никто, то как надо. Ссылки на стандарт будут всячески порицаться и осмеиваться.

(Тем временем надеемся, что комитетские ЛОМы и ЛПРы, вдохновившись этой хорошей фичей, подумают покрепче и сделают в итоге отличную. Ну или не надеемся)
🤯12❤4🤡2