Почему unique_ptr :: release не определено с [[nodiscard]]? - PullRequest
7 голосов
/ 05 марта 2020

C ++ 17 добавлено [[nodiscard]].

C ++ 20 добавлено использование [[nodiscard]] в empty методы, например, vector::empty() - возможно, , чтобы избежать путаницы пользователя с методом clear (т. е. случайным вызовом empty () для clear вектор).

Почему C ++ 20 не использовал эту возможность для добавления [[nodiscard]] к unique_ptr::release?


Существует ли допустимый разумный сценарий, в котором можно было бы вызвать unique_ptr::release, не принимая возвращенное значение?


Таким же образом, чтобы избежать путаницы пользователей (если это было причиной для добавления [[nodiscard]] к empty методы) - имя release всегда было очень запутанным, звучит как, ну ... что-то здесь будет выпущено.

Добавление [[nodiscard]] может каким-то образом решить эту проблему с именем.

Ответы [ 3 ]

6 голосов
/ 05 марта 2020

Об этом говорится в документе, который добавил [[nodiscard]] ко многим функциям. От P0600R1 это замечание о добавлении [[nodiscard]] к unique_ptr::release()

Titus: в Google 3,5% вызовов не будут выполнены, но анализ показал, что это правильно (но странная форма владения семантикой). См. Отражатель по электронной почте.

2 голосов
/ 05 марта 2020

Поскольку ранее вы извлекали значение указателя и с ним что-то делали.

Простое приближение:

unique_ptr<someclass> ptr;
// ...
someclass *s = ptr.get();
if (s->are_we_there_yet()) {
    ptr.release();
    // finish up with s...
    s->close_garage_door();
    delete s;
}
1 голос
/ 05 марта 2020
// returns true on success
bool run_a_thing(void (*)(void*), void* context);

struct state {
    // whatever
};

void runner(void* context) {
    std::unique_ptr<state> s(static_cast<state*>(context));
    // do things
}

void run_thing() {
    auto s = std::make_unique<state>(....);
    if (run_a_thing(runner, s.get())) {
        s.release();
    }
}

Это в основном структура libstdc ++ std::thread. run_a_thing равно pthread_create.

...