【发布时间】:2014-07-17 01:59:35
【问题描述】:
在 C++ 中:
assert( std::is_same<int , int>::value ); // does not compile
assert( (std::is_same<int , int>::value) ); // compiles
谁能解释一下原因?
【问题讨论】:
-
宏忽略编译器语义(当宏展开时这些语义还不存在)。您几乎可以传递任何用逗号分隔的内容。
-
值得注意的是,这些括号使四个Boost PP data types成为可能。
-
std::is_same是一个编译时检查,所以无论如何做一个运行时断言没有多大意义!改为执行编译时断言。在 C++11 中有 static_assert ,否则还有 a lot of options -
@MattMcNabb 这是您不应该做出的假设,因为我相信我有能力编写任何符合 c++ 标准规范的内容。也许我打算延迟运行时的断言,尽管它在编译时是可确定的。也许我公司有一个签到验证系统,它只允许你提交可以编译的代码,我现在只想回家,所以我选择使用运行时断言来通过签到系统。
-
@igbgotiz:在这种情况下,您是在有意地检查损坏的代码。我会解雇你的。 (损坏的代码不是断言也不是 is_same,损坏的代码是导致它被触发的任何原因)
标签: c++ c-preprocessor assert operator-precedence