2016-04-05 45 views
0

我试图用std::is_same来验证强类型枚举的基本类型,我注意到一个奇怪的情况,我需要使用双括号,但我不明白为什么。我已经减少了例如低至如下:为什么需要双括号与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; 
} 

编译错误:

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 

谁能解释这或指向我,做一个参考?

+2

这是因为'assert()'是一个宏。 –

回答

4

由于assert是宏,表达assert(std::is_same<unsigned int,uint32_t>::value == true);似乎调用assert两个参数由于逗号intuint32_t之间所以编译器抱怨assert仅采用一个参数,但被提供的两个。

事实上,再次将它放在括号内解决了这个问题。

相关问题