2016-04-05 23 views
0

ile çift parantez gerekiyorsa Ben güçlü bir yazılan enum temel türünü doğrulamak için std::is_same kullanmaya çalışıyordum ve çift parantez kullanmak gerektiğinde garip bir durum fark ettim, ama neden anlamıyorum . Ben aşağı aşağıdaki gibi hiç örnek azalttık:Neden std :: is_same

#include <type_traits> 
#include <cassert> 
#include <stdint.h> 

int main(int argc, char *argv[]) 
{ 
    assert((std::is_same<unsigned int,uint32_t>::value == true)); // OK 
    assert((std::is_same<unsigned int,uint32_t>::value) == true); // OK 
    //assert(std::is_same<unsigned int,uint32_t>::value == true); // Compile error 
    static_assert(std::is_same<unsigned int,uint32_t>::value == true, "BAD"); // OK 
    return 0; 
} 

Derleme hatası:

isSameAssert.cpp:9:62: error: macro "assert" passed 2 arguments, but takes just 1 
    assert(std::is_same<unsigned int,uint32_t>::value == true); // Compile error 
                  ^
isSameAssert.cpp: In function ‘int main(int, char**)’: 
isSameAssert.cpp:9:5: error: ‘assert’ was not declared in this scope 
    assert(std::is_same<unsigned int,uint32_t>::value == true); // Compile error 
    ^
make: *** [build/isSameAssert] Error 1 

kimse bu açıklamaya ya da beni yapan bir referansa işaret? assert bir makro olduğunu

+2

Çünkü, 'assert() 'bir makrodur. –

cevap

4

Çünkü böylece derleyici assert sadece bir parametre alır yakınıyor, ancak iki verildi int ila uint32_t ifade assert(std::is_same<unsigned int,uint32_t>::value == true); nedeniyle virgül assert iki parametreleri çağırmak gibi görünüyor.

Aslında, parantez içine tekrar koyarak bu sorunu çözer.

İlgili konular