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

gaa*_*kam 4 c++ assert

有人可以向我解释为什么在地球上这个代码片段拒绝工作?

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

int main()
{
    assert(is_same<int, int>::value);
}
Run Code Online (Sandbox Code Playgroud)

编译失败,因为根据编译器:

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);
  ^
Run Code Online (Sandbox Code Playgroud)

什么?is_same<int, int>::value毫无疑问是一个论点.同样assert 在这个范围内声明的,编译器本身证实,在以前的错误!

http://ideone.com/LcMVkn

πάν*_*ῥεῖ 6

宏分割您的参数,如下所示:

    is_same<int , int>::value
 // ^^ par1  ^^// ^^ par2  ^^
Run Code Online (Sandbox Code Playgroud)

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

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

assert((is_same<int, int>::value));
    // ^                        ^
Run Code Online (Sandbox Code Playgroud)

  • C代码有同样的问题:预处理器只识别括号.`assert(a [1,1]);`是一个错误,同样对于复合文字.它在C++中更为明显. (3认同)
  • 真正的答案是输入`static_assert(is_same <int,int> :: value)`,如已经建议的那样.虽然这个例子显然是设计的,因为`int`总是`int` :) (2认同)
  • @Lightness _real_ 真正的答案是,C 预处理器不解析 C++ 代码,并且在具有多个类型参数的模板类型上失败。 (2认同)