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
C++20. Что выведет код?
#include <iostream>
#include <span>
int main() {
int a[] = {10, 20, 30};
std::span<int> view(a);
auto part = view.subspan(1, 2);
part[0] = 99;
std::cout << a[0] << ' ' << a[1] << ' ' << a[2];
}
👾 — 10 99 30
👍 — 10 20 30
🥰 — 99 20 30
⚡️ — Ошибка компиляции
span хранит представление существующих элементов. subspan начинает участок с a[1]. Запись в part[0] меняет именно этот элемент массива.
Please open Telegram to view this post
VIEW IN TELEGRAM
👾1