【发布时间】:2016-03-10 12:01:46
【问题描述】:
#include <cassert>
#include <string>
#include <type_traits>
const std::string& const_string = "bla";
std::string const & string_const = "blabla";
static_assert(std::is_same<decltype(const_string), decltype(string_const)>::value, "Uhoh");
int main()
{
assert(std::is_same<decltype(const_string), decltype(string_const)>::value);
}
使用 C 的断言断言两种类型在编译时和运行时相同。所有的 Clang、MSVC2015 和 GCC 都报告相同的错误,所以我很确定 it's me:
main.cpp:13:49: error: too many arguments provided to function-like macro invocation
assert(std::is_same<decltype(const_string), decltype(string_const)>::value);
^
/usr/include/assert.h:91:10: note: macro 'assert' defined here
# define assert(expr) \
^
我只是在assert 中没有看到两个参数。更重要的是,static_assert 工作得很好......那么这里发生了什么?
【问题讨论】:
-
我相信预处理器会看到两个“比较”;
std::is_same<decltype(const_string)和decltype(string_const)>::value。预处理器无法判断它们不是。 -
static_assert 是关键字,assert 是预处理器宏。预处理器宏以非智能方式将参数拆分为
,。额外的括号可以防止这种情况发生。
标签: c++ assert static-assert