2016-11-14 3 views
4

Может кто-нибудь объяснить мне, почему на Земле этот фрагмент кода отказывается работать?Почему я не могу использовать assert с std :: is_same?

#include <cassert> 
#include <type_traits> 
using namespace std; 

int main() 
{ 
    assert(is_same<int, int>::value); 
} 

компиляция терпит неудачу, потому что, в соответствии с компилятором:

prog.cpp:7:33: error: macro "assert" passed 2 arguments, but takes just 1 
    assert(is_same<int, int>::value); 
          ^
prog.cpp: In function 'int main()': 
prog.cpp:7:2: error: 'assert' was not declared in this scope 
    assert(is_same<int, int>::value); 
^

Что? is_same<int, int>::value, несомненно, один аргумент. Также assert-, объявленный в этой области, и сам компилятор подтвердил это в предыдущей ошибке!

http://ideone.com/LcMVkn

+4

Почему бы не использовать [ 'static_assert'] (http://en.cppreference.com/ w/cpp/language/static_assert) и предупредить разработчика во время компиляции вместо времени выполнения? –

+0

@CaptainObvlious Я пытаюсь проверить свой собственный код ... и это все равно не производство. – gaazkam

+3

Итак? Вы по-прежнему будете получать сообщение об ошибке, если что-то не так, и гораздо лучше быть информированным во время сборки, вместо того, чтобы справляться с проблемой тестирования и ждать проверки времени выполнения. Вы делаете то же самое, но 'assert' является меньшим из двух вариантов здесь. –

ответ

5

Макрос разбивает параметр (ы), как это:

is_same<int , int>::value 
// ^^ par1 ^^// ^^ par2 ^^ 

Как assert() является определение макроса (с одним параметром), оно обрабатывается С-препроцессора. Препроцессор не знает синтаксиса C++, как параметры шаблона, закодированные в угловых скобках (<>), разделенных ,. Таким образом, выражение параметра разбивается, как показано выше.

Вы можете избежать этого, используя дополнительные круглые скобки, так что C-препроцессор будет принимать этот параметр в целом:

assert((is_same<int, int>::value)); 
    //^     ^
+0

Итак, ответ заключается в том, чтобы набрать 'assert ((is_same :: value))', правильно? – gaazkam

+0

Является ли assert, чтобы работать так, или это ошибка в этой конкретной реализации? – gaazkam

+0

Кроме того, почему происходит этот раскол? Это очень противоречиво. – gaazkam