C ++ 0x: noexcept (ndebug) для тестирования? - PullRequest
3 голосов
/ 10 сентября 2011

Я читал об опасении, что чрезмерное использование noexcept может помешать тестируемой библиотеке.

Обратите внимание:

T& vector::front() noexcept {
    assert(!empty());         // <- this may throw in some test-frameworks
    return data[0];
}

С аннотацией с noexcept компилятор может оптимизировать исключение-кодировать, что может / могло бы помешать правильной обработке assert() (или какой-либо функции, которую автор хочет использовать здесь для своих тестов).

Поэтому, мне интересно, возможно ли это в библиотеке для никогда не использует безусловный noexcept, но всегда "связывает" его с условием "я в тесте".Вот так:

#ifdef NDEBUG    // asserts disabled
static constexpr bool ndebug = true;
#else            // asserts enabled
static constexpr bool ndebug = false;
#end

T& vector::front() noexcept(ndebug) {
    assert(!empty());
    return data[0];
}

, а затем, возможно, добавьте его в качестве макроса (хотя я ненавижу это):

#define NOEXCEPT noexcept(ndebug)

T& vector::front() NOEXCEPT {
    assert(!empty());
    return data[0];
}

Что вы думаете?Имеет ли это какой-либо смысл вообще?Или это не осуществимо?Или это не решает проблему?Или проблем нет вообще?: -)

1 Ответ

2 голосов
/ 19 сентября 2011

Если вы не можете доказать, что функция не будет выдавать исключение, вам не следует помечать ее noexcept. Это так просто.

Тем не менее, noexcept(ndebug) кажется мне разумным. Я не вижу причин, чтобы скрыть это за макросом. Шаблонные функции часто имеют подробные noexcept условия.

Если функция в активе может выдавать в тестовых режимах, то ваша программа может спонтанно std::terminate в тестовом режиме. (Это очень похоже на неявное assert на самом деле.)

Единственный недостаток, который я вижу, это то, что если это произойдет, вы не получите номер строки и подсказку. Это, и компилятор должен предупредить вас, если вы вызываете функцию noexcept(false) из noexcept(true), чтобы вы могли получить некоторый шум.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...