我试图使用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
任何人都可以解释这一点或指向我的参考吗?
答案 0 :(得分:4)
由于assert
是一个宏,因为assert(std::is_same<unsigned int,uint32_t>::value == true);
和assert
之间的逗号,表达式int
似乎用两个参数调用uint32_t
所以编译器抱怨assert
只接受一个参数,但提供了两个参数。
确实,将它再次放在括号中解决了这个问题。