为什么我不能将assert与std :: is_same一起使用?

时间:2016-11-14 21:36:36

标签: c++ assert

有人可以向我解释为什么地球上的代码片段会拒绝工作吗?

#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

1 个答案:

答案 0 :(得分:5)

宏分割你的参数如下:

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

由于assert()是一个宏定义(带有一个参数),它由C预处理器处理。预处理器不知道c ++语法,例如用<>分隔的尖括号(,)中的模板参数。所以参数表达式如上所示分开。

您可以使用额外的括号来避免这种情况,因此C预处理器会将该参数作为一个整体:

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