2015-08-10 2 views
2

static_assert Путь был в библиотеке Lokiimplemented (где он был на самом деле препроцессор макро называется STATIC_CHECK), она может быть использована следующим образом:Где используется static_assert?

STATIC_CHECK(myCondition, My_Error_Message); 

Обратите внимание, что My_Error_Message должен быть допустимым идентификатором.

Мне интересно, как static_assert реализован для стандарта C++11, чтобы принять строковый литерал для сообщения об ошибке.

Я решил посмотреть в файле type_traits, который находится в /usr/include/c++/4.8 на моем Ubuntu 14.04 с g ++ 4.8.2. К моему удивлению, я нашел здесь только, но не определение (и макропроцессор препроцессора). Я не нашел его в файлах, включенных в type_traits.

Итак, где искать реализацию static_assert?

ответ

2

static_assert - это новая языковая функция на C++ 11, а не библиотека, включенная в файл заголовка. Соответствующая реализация на C++ бесплатна для реализации static_assert, но она нравится. Он может быть встроен в компилятор (я подозреваю, что большинство компиляторов это делает), или он может быть частью библиотеки (хотя это было бы сложно, так как static_assert не требует файла заголовка). Я думаю, что лучший способ узнать, что именно для вашего конкретного компилятора, - это проверить документацию и, при необходимости, просмотреть источник.

+0

Ницца. Это объясняет две вещи. Во-первых, это объясняет, почему это 'static_assert', а не' std :: static_assert'. Во-вторых, это расстраивает подозрение, что Александреску не обратил внимания на лучшее решение. – AlwaysLearning

0

static_assert должен быть встроен в компилятор, потому что условие проверки должно быть проверено во время компиляции. Если бы он был проверен с помощью некоторого кода библиотеки, это скорее сделалось бы во время выполнения.

На оборотной стороне assert - это макрос, который уже говорит, что он реализован в библиотечном коде, и его проверка выполняется во время выполнения.

+0

Loki сделал это, правильно? .. – AlwaysLearning

+0

В C++ на самом деле можно создавать библиотеки, которые проверяют условия во время компиляции с помощью системы шаблонов (см. Ссылку на исходный вопрос OP). Эти библиотеки довольно сложны, но это все еще возможно. – templatetypedef

+0

@MeirGoldenberg Причиной ошибки компиляции при условии, что условие довольно простое, с этим условием оценивается во время компиляции. Но сообщение должно быть включено в диагностику, которая не является простой или гарантированной для работы с компиляторами. – edmz

Смежные вопросы