有人可以向我解释为什么在地球上这个代码片段拒绝工作?
#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 是在这个范围内声明的,编译器本身证实,在以前的错误!
宏分割您的参数,如下所示:
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)
| 归档时间: |
|
| 查看次数: |
635 次 |
| 最近记录: |