Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Gotchas

Boost , Boost.Optional , Tutorial

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

<optional<bool>>следует использовать с особой осторожностью и вниманием.

Во-первых, он функционально похож на трисостояние булевое (ложное, может быть, истинное) — например,boost::tribool— за исключением того, что в трисостоянии булевое состояниепредставляет собой действительное значение, в отличие от соответствующего состояния неинициализированного<optional<bool>>. Следует тщательно рассмотреть, действительно ли требуется<optional<bool>>вместо<tribool>.

Во-вторых, хотя<optional<>>обеспечивает контекстное преобразование в<bool>в C++11, это возвращается к неявному преобразованию на старых компиляторах. Это преобразование относится к состоянию инициализации, а не к содержащемуся значению. Использование<optional<bool>>может привести к тонким ошибкам из-за неявного<bool>Преобразование:

void foo ( bool v ) ;
void bar()
{
    optional<bool> v = try();
    // The following intended to pass the value of 'v' to foo():
    foo(v);
    // But instead, the initialization state is passed
    // due to a typo: it should have been foo(*v).
}

Единственная неявная конверсия —<bool>, и она безопасна в том смысле, что типичные интегральные рекламные акции не применяются (то есть, если<foo()>вместо этого принимает<int>, он не будет компилироваться).

В-третьих, смешанные сравнения с<bool>работают иначе, чем аналогичные смешанные сравнения между указателями и<bool>, поэтому результаты могут вас удивить:

optional<bool> oEmpty(none), oTrue(true), oFalse(false);
if (oEmpty == none);  // renders true
if (oEmpty == false); // renders false!
if (oEmpty == true);  // renders false!
if (oFalse == none);  // renders false
if (oFalse == false); // renders true!
if (oFalse == true);  // renders false
if (oTrue == none);   // renders false
if (oTrue == false);  // renders false
if (oTrue == true);   // renders true

Иными словами, для<optional<>>следующее утверждение не выполняется:

assert((opt == false) == (!opt));

PrevUpHomeNext

Статья Gotchas раздела Boost.Optional Tutorial может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Tutorial ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 03:39:31/0.0054740905761719/1