首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在ISO C++11中,有没有办法把一个static_assert放到一个表达式中?

在ISO C++11中,有没有办法把一个static_assert放到一个表达式中?
EN

Stack Overflow用户
提问于 2015-07-09 16:12:31
回答 3查看 1.7K关注 0票数 23

在C++11中,这样写是合法的,例如:

代码语言:javascript
复制
int b = (some_function_returning_void(), 1020);

你会得到1020美元。但它不会让你写下:

代码语言:javascript
复制
int b = (static_assert(2 > 1, "all is lost"), 304);

documentation解释了static_assert (显然是keyword )可能发生的法律位置:

静态断言声明可以出现在块范围(作为块声明)和类体内部(作为成员声明)

我试了几个方法,直到这个方法起作用:

代码语言:javascript
复制
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。有什么干净的变通方法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-09 16:20:00

正如@dyp在评论中提到的,您可以滥用逗号运算符和lambda表达式:

代码语言:javascript
复制
([]{static_assert(true,"");}, 42)

Live on Coliru

票数 24
EN

Stack Overflow用户

发布于 2015-07-09 16:17:29

static_assert is not an expression (不像sizeof),所以你不能在需要表达式的地方使用它。

它甚至不是void类型的表达式(有趣的是,throwvoid类型的表达式),所以您甚至不能在三元组中使用它。

语句表达式不是标准的C++,所以我建议不要使用它们。

一个lambda

代码语言:javascript
复制
int b = []{
    static_assert(2 > 1, "all is lost"); return 304;
}();

代码语言:javascript
复制
int b = ([]{static_assert(2 > 1, "all is lost");}, 304);

几乎不是干净的。(第二个lambda看起来像是一根线的宽度,而不是未定义的)。

票数 9
EN

Stack Overflow用户

发布于 2015-07-09 17:26:58

函数模板怎么样:

代码语言:javascript
复制
template<int T> void my_static_assert()
{
    static_assert(T, "asserted");
}

然后你可以使用逗号操作符,你甚至不需要调用函数:

代码语言:javascript
复制
int x = (my_static_assert<(2 > 1)>, 2001);

为了让解析器满意,您可能需要在各处添加一些括号。您丢失了静态断言消息,但它是有效的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31311748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档