C++20. Что выведет код?
#include <iostream>
#include <optional>
int main() {
std::optional<bool> flag = false;
std::cout << (flag ? "yes" : "no") << ' '
<< std::boolalpha << *flag;
}
👾 — no false
👍 — yes false
🥰 — yes true
⚡️ — Ошибка компиляции
В условии optional проверяет, содержит ли он значение. Здесь значение есть, поэтому выбирается yes. Само хранимое значение равно false.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
C++20. Что выведет код?
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
int main() {
std::vector<int> values{1, 2, 2, 3};
auto end = std::remove(values.begin(), values.end(), 2);
std::cout << values.size() << ' '
<< std::distance(values.begin(), end) << ' ';
values.erase(end, values.end());
std::cout << values.size();
}
👾 — 2 2 2
👍 — 4 4 2
🥰 — 4 2 4
⚡️ — 4 2 2
std::remove перемещает сохраняемые элементы в начало диапазона и возвращает его новый логический конец. Размер vector остаётся равным 4. В сохраняемой части два элемента; после erase физический размер тоже становится равным 2.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡2❤1
C++20. Что выведет код?
#include <iostream>
#include <map>
int main() {
int calls = 0;
auto build = [&] { ++calls; return 99; };
std::map<int, int> values{{1, 7}};
auto [it, inserted] = values.try_emplace(1, build());
std::cout << calls << ' ' << std::boolalpha
<< inserted << ' ' << it->second;
}
👾 — 1 false 7
👍 — 0 false 7
🥰 — 1 true 99
⚡️ — 0 true 99
build() вычисляется до входа в try_emplace, поэтому calls становится равным 1. Ключ 1 уже есть: вставка не выполняется, а значение 7 сохраняется.
Please open Telegram to view this post
VIEW IN TELEGRAM
👾1
C++20. Что выведет код?
#include <iostream>
#include <memory>
#include <utility>
int main() {
auto ptr = std::make_unique<int>(7);
auto read = [p = std::move(ptr)] { return *p; };
std::cout << std::boolalpha << (ptr == nullptr)
<< ' ' << read();
}
👾 — false 7
👍 — Ошибка компиляции
🥰 — true 7
⚡️ — true 0
Инициализирующий захват перемещает unique_ptr в поле объекта-замыкания. Исходный ptr становится пустым, а лямбда владеет объектом и возвращает хранимую семёрку.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰7❤1
C++20. Что выведет код?
#include <iostream>
#include <string>
#include <string_view>
int main() {
std::string text = "code";
std::string copy = text;
std::string_view view = text;
text[0] = 'm';
std::cout << copy << ' ' << view;
}
👾 — mode mode
👍 — code mode
🥰 — code code
⚡️ — Неопределённое поведение
copy хранит отдельную копию строки. view ссылается на символы text и видит замену c на m. Исходная строка остаётся живой, её размер не меняется, поэтому представление действительно.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
C++20. Что выведет код?
#include <iostream>
#include <utility>
int main() {
int value = 7;
int previous = std::exchange(value, 0);
std::cout << previous << ' ' << value;
}
👾 — 0 7
👍 — 7 7
🥰 — 0 0
⚡️ — 7 0
std::exchange сохраняет старое значение value, присваивает переменной новое значение 0 и возвращает сохранённую семёрку.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡4
C++20. Что выведет код?
#include <functional>
#include <iostream>
#include <tuple>
int main() {
int x = 1;
auto a = std::make_tuple(x);
auto b = std::make_tuple(std::ref(x));
std::get<0>(a) = 5;
std::get<0>(b) = 9;
std::cout << x << ' ' << std::get<0>(a);
}
👾 — 1 5
👍 — 9 9
🥰 — 9 5
⚡️ — Ошибка компиляции
make_tuple(x) сохраняет копию числа. При передаче std::ref(x) получается кортеж с элементом int&, связанным с x. Поэтому запись через b меняет x, а элемент a остаётся равным 5.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰3