问题标签 [static-assert]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 为什么 std::is_function导致编译错误?
嗨,我试图在 C++11 中实现一个类似于 C++ 概念的功能(C++14)。这个想法只是为std::for_each()
算法编写包装函数,我只是检查第三个参数是否是函数。所以我编写了以下代码,但是我无法按应有的方式编译它。我正在使用带有 gcc4.8.1 的 Ubuntu12.04。
test_1.cpp
我收到以下编译错误,从中可以看出失败与有效功能static_assert()
不正确。display
编译错误
但是,如果我对其他 type_traits 函数做同样的事情,我会得到以下正确且预期的错误。
test_2.cpp
编译器输出
问题
所以,我想了解为什么我的第一个程序不能正常工作,我的代码/理解中是否存在错误或者是其他问题。我希望以上数据足以理解我的问题。但是,如果有人想要一些额外的数据,请告诉我。
c++ - 在 static_assert 的帮助下改进诊断
在模板编程中,static_assert
帮助程序员检查模板参数的约束,并在违反约束时生成人类可读的错误消息。
考虑这段代码,
我的想法是:如果第一次static_assert
失败,这意味着不满足某些要求,因此编译应该停止,只生成第一条错误消息——因为继续编译只是为了生成越来越多的信息没有多大意义错误消息,其中大多数通常指向单个约束违规。数百条错误消息,而不仅仅是一条,在屏幕上看起来非常可怕——我什至会说,它在某种程度上违背了它的目的。T
static_assert
例如,如果我将上述函数模板称为:
GCC 4.8 生成以下内容:
正如你所看到的(在线),这是太多的错误。如果第一个static_assert
失败,如果继续编译,很可能其余代码也会失败,那为什么还要继续编译呢?在模板编程中,我相信很多程序员都不想要这样的级联错误信息!
我试图通过将函数拆分为多个函数来解决这个问题,每个函数只检查一个约束,如:
现在这会生成:
这是一个很大的改进——只有一条错误消息更容易阅读和理解(参见在线)。
我的问题是,
- 为什么编译不会停在第一个
static_assert
? - 由于拆分函数模板并检查每个 function_impl 中的一个约束,仅有助于GCC 和 clang仍然会 产生大量错误,有没有办法以更一致的方式改进诊断——适用于所有编译器的东西?
c++ - Is there a static_assert replacement which satisfies the C99 standard?
I have been trying to implement a method similar to static_assert
which is defined in the C++11 standard. The main problem is how does the C++ compiler write the text message being passed to static_assert
as a const char*
? I can get the compiler to write a message like A_is_not_POD
. This is what I have:
But it would be quite nice to get the compiler to write something like "Error: A is not POD."
Any suggestions?
c++ - static_assert 不会立即中断编译
代码示例:
为什么编译器不会在第一个 static_assert 上中断编译而是继续工作直到达到最大实例化深度?
这里唯一的问题是它需要很长时间才能中断,并产生大量输出。有没有办法让它变得更好?使用的编译器:gcc 版本 4.8.1
c++ - 当 [] 运算符失败并且我需要对此进行断言时会发生什么?
我有一个形状像数组的查找表int
,我需要在编译时检查[]
运算符的使用是否可能导致超出范围的读取。
我知道 astatic_assert
基本上需要两件事:
- 常量表达式
- 给定的表达式应返回 a
bool
或可转换/等价于 abool
现在 in g++ 4.8.1
aninitializer_list
应该是 C++11 中的常量表达式,我不知道我见过多少次这样if
写的构造if(arr[N]){...}
;那么这个断言有什么问题呢?
c++ - 对于相同的 static_assert 消息,我应该依赖 MACROS 吗?
static_assert具有以下语法,它表明需要字符串文字。
static_assert ( bool_constexpr ,字符串字面量);
由于在编译时无法观察到字符串的实例,因此以下代码无效:
我的代码中到处都是静态断言,它们说的是相同的错误消息。由于需要字符串文字,最好用 MACRO 替换所有重复的字符串文字,还是有更好的方法?
c++ - 如何将类型名称作为字符串嵌入到 static_assert() 中?
问题
由于消息不是字符串文字,因此无法构建以下内容。
最终,如果我尝试编译Foo<Bar> fb;
.
是否可以按照要求在编译时构建此字符串static_assert
?
c++ - MSVC12 认为从 std::array 派生的聚合不是 pod
鉴于以下
以下编译器同意这litmus
是 pod:
- clang++ 3.5 版(主干 198621)http://coliru.stacked-crooked.com/a/7add7a2fe58a7e38
- g++ 4.8.1 http://coliru.stacked-crooked.com/a/74cfe97f06c8c128
但是,MSVC12 (VS2013 RTM) 坚持认为第二个断言失败。
- 谁是对的?
- 有什么技巧可以让 MSVC 将类视为 pod?
编辑有关信息:
is_trivially_copyable<litmus>
在 MSVC 上返回真实性。这对于不严格要求实际 POD 的许多情况可能很有用。
c++ - 使用 static_assert 检查 Q_OBJECT 宏
如果给我的类型的声明不包含Q_OBJECT
宏,我有一些有趣的需要显示编译错误。我发现了一种不好的方法。实际上它重复了 Qt 开发人员的想法来做同样的伎俩:
这很好用,但它确实给出了奇怪的错误消息。我想显示一条可读的消息。一种方法是使用static_assert
构造。但我不知道如何实现Q_OBJECT
宏存在的静态验证条件。也许有人可以提出一个漂亮的黑客?也非常感谢任何想法。
c++ - 使用断言和静态断言函数
我正在尝试了解 static_assert 和 assert 的使用以及它们之间的区别,但是关于此的来源/解释很少
这是一些代码
对冗余的评论将不胜感激(因为我正在学习“如何使用 C++”)
在cmd中输出
我一直在尝试找出它的不同方法和用途,但据我所知,它是运行时检查和 if 语句的另一种“类型”
有人可以澄清用途并解释每个人的作用和它们的区别吗?