在C++11中,这样写是合法的,例如:
int b = (some_function_returning_void(), 1020);
你会得到1020美元。但它不会让你写下:
int b = (static_assert(2 > 1, "all is lost"), 304);
documentation解释了static_assert (显然是keyword )可能发生的法律位置:
静态断言声明可以出现在块范围(作为块声明)和类体内部(作为成员声明)
我试了几个方法,直到这个方法起作用:
int b = ({static_assert(2 > 1, "all is lost"); 304;});
但是有了-Wpedantic
,我就得到了"warning: ISO C++ forbids braced-groups within expressions"
。有趣的是,这些被称为“语句表达式”和used in the Linux kernel。
但让我们想象一下,我想继续使用-Wpedantic
。有什么干净的变通方法吗?
发布于 2015-07-09 16:20:00
发布于 2015-07-09 16:17:29
static_assert
is not an expression (不像sizeof
),所以你不能在需要表达式的地方使用它。
它甚至不是void
类型的表达式(有趣的是,throw
是void
类型的表达式),所以您甚至不能在三元组中使用它。
语句表达式不是标准的C++,所以我建议不要使用它们。
一个lambda
int b = []{
static_assert(2 > 1, "all is lost"); return 304;
}();
或
int b = ([]{static_assert(2 > 1, "all is lost");}, 304);
几乎不是干净的。(第二个lambda看起来像是一根线的宽度,而不是未定义的)。
发布于 2015-07-09 17:26:58
函数模板怎么样:
template<int T> void my_static_assert()
{
static_assert(T, "asserted");
}
然后你可以使用逗号操作符,你甚至不需要调用函数:
int x = (my_static_assert<(2 > 1)>, 2001);
为了让解析器满意,您可能需要在各处添加一些括号。您丢失了静态断言消息,但它是有效的。
https://stackoverflow.com/questions/31311748
复制相似问题