C++ C++  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

string_view, span и невладеющие представления

Тест проверяет интерфейсы без копирования, где главная цена — обязанность доказать время жизни. Вопросы разбирают строки без завершающего нуля, span фиксированной длины, временные контейнеры и ошибки, когда лёгкое представление сохраняют дольше владельца.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. В тесте 25 вопросов, время — 70 минут. Во многих заданиях недостаточно узнать конструкцию: проследите порядок вычислений, время жизни объектов, владение ресурсами и условия, при которых решение остаётся корректным. После завершения откроются правильные ответы, объяснения, общий результат и тематические шкалы.
Вопрос 1 из 25
Что хранит std::string_view?
Вопрос 2 из 25
Гарантирует ли `view.data()` завершающий ноль сразу после view.size() символов?
C++C++20
std::string text = "header:value";
std::string_view view{text.data(), 6}; // "header"

const char* p = view.data();
std::printf("%s", p); // печать не ограничена view.size()
Вопрос 3 из 25
Почему `printf("%s", view.data())` может вывести лишние символы?
C++C++20
std::string s = "hello-world";
std::string_view view{s.data(), 5};
printf("%s", view.data());
Вопрос 4 из 25
Что делает `view.remove_prefix(2)`?
C++C++20
std::string_view view = "hello world";
view.remove_prefix(2);

std::cout << view; // "llo world"; исходная строка не меняется
Вопрос 5 из 25
Почему `"abc"sv` удобно?
C++C++20
using namespace std::string_view_literals;

auto command = "quit"sv;
static_assert(std::is_same_v<decltype(command), std::string_view>);
parse(command);
Вопрос 6 из 25
Что выражает параметр `std::span<const int> values`?
C++C++20
int values[]{3, 5, 8, 13};

void print(std::span<const int> input) {
    for (int value : input) std::cout << value << ' ';
}

print(values);
Вопрос 7 из 25
Что означает `std::span<int, 4>`?
C++C++20
void transform_block(std::span<int, 4> block) {
    static_assert(decltype(block)::extent == 4);
    std::ranges::reverse(block);
}

std::array<int, 4> data{1,2,3,4};
transform_block(data);
Вопрос 8 из 25
Можно ли построить span из std::list<int>?
Вопрос 9 из 25
Что возвращает `s.subspan(2, 3)`?
C++C++20
std::array<int, 8> values{0,1,2,3,4,5,6,7};
std::span<int> all = values;
auto middle = all.subspan(2, 3);

for (int x : middle) std::cout << x;
Вопрос 10 из 25
Какая проблема остаётся у operator[] span?
Вопрос 11 из 25
Почему возвращаемый view висячий?
C++C++20
std::string_view make_name(){
    std::string name = "Ada";
    return name;
}
Вопрос 12 из 25
Что может сделать span на vector недействительным?
Вопрос 13 из 25
Безопасен ли `std::string_view v = std::string("abc");` после точки с запятой?
C++C++20
std::string_view view = std::string("abc");

// Временная std::string уничтожена в конце полной инструкции.
std::cout << view;
Вопрос 14 из 25
Может ли перемещение std::string инвалидировать view на её данные?
Вопрос 15 из 25
Когда span на локальный массив остаётся безопасен?
Вопрос 16 из 25
Какая сигнатура уместна для функции, которая только разбирает имя и не сохраняет его?
C++C++20
ParsedName parse_name(std::string_view text) {
    auto separator = text.find(':');
    return {text.substr(0, separator), text.substr(separator + 1)};
}
// Безопасность возврата зависит от того, владеет ли ParsedName строками.
Вопрос 17 из 25
Какая сигнатура безопаснее для функции, сохраняющей имя внутри объекта?
Вопрос 18 из 25
Когда span лучше пары `(T* data, size_t size)`?
C++C++20
void decode(std::span<const std::byte> packet);

std::array<std::byte, 128> buffer{};
decode(buffer);
decode(std::span{buffer}.first(32));
Вопрос 19 из 25
Что лучше вернуть из функции, которая формирует новый текст?
C++C++20
std::string make_label(const User& user) {
    std::string result = user.first_name();
    result += ' ';
    result += user.last_name();
    return result;
}
Вопрос 20 из 25
Можно ли принимать `std::span<const std::byte>` как двоичный пакет?
C++C++20
Header parse_header(std::span<const std::byte> packet) {
    if (packet.size() < sizeof(WireHeader))
        throw ParseError{"short packet"};
    return decode_header(packet.first(sizeof(WireHeader)));
}
Вопрос 21 из 25
Какой тест обнаружит ошибочное использование `strlen(view.data())`?
C++C++20
std::array<char, 4> raw{'A', 'B', 'C', 'D'};
std::string_view view(raw.data(), raw.size());

// Тест запускает функцию, которая ошибочно делает strlen(view.data()).
EXPECT_EQ(parse_length(view), 4);
Вопрос 22 из 25
Что может обнаружить AddressSanitizer для span?
Вопрос 23 из 25
Какие границы нужно тестировать для `first(n)` у span?
C++C++20
std::array<int, 3> values{1,2,3};
std::span<int> span = values;

auto empty = span.first(0);
auto full  = span.first(span.size());
// span.first(span.size() + 1) нарушает предусловие.
Вопрос 24 из 25
Как документировать поле string_view в классе?
Вопрос 25 из 25
Какой тест сравнивает корректность API со span и старого API `ptr,size`?
C++C++20
Result old_parse(const std::byte* data, std::size_t size);
Result new_parse(std::span<const std::byte> data);

for (const auto& sample : corpus) {
    EXPECT_EQ(old_parse(sample.data(), sample.size()), new_parse(sample));
}

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу