问题标签 [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.

0 投票
3 回答
9969 浏览

c++ - static_assert - 一种动态自定义错误消息的方法

有没有办法让 static_assert 的字符串被动态定制然后显示?
我的意思是这样的:

0 投票
2 回答
237 浏览

c++ - 这个 static_assert 会被触发吗?

关键是我认为这两个 static_assert* s * 永远不会被触发——即使有人也尝试过。
那么这个Q的答案是什么?

0 投票
2 回答
18578 浏览

c++ - C ++ 11 - constexpr函数中的static_assert?

如何在函数static_assert内正确执行 a constexpr?例如:

这不是有效的 C++11 代码,因为 constexpr 函数必须只包含 return 语句。我不认为该标准对此有例外,尽管 GCC 4.7 不允许我编译此代码。

0 投票
3 回答
323 浏览

c++ - 有没有办法使用静态断言和类型特征防止一个类从两次派生?

我意识到这是一个人为的例子,但我想要一个编译检查来防止这种情况......

0 投票
1 回答
358 浏览

c++ - 如何使用静态断言和类型特征防止嵌套模板类型中的菱形图案?

可能重复:
有没有办法防止一个类使用静态断言和类型特征从两次派生?

我要防止的是不止一个基于 C 的模板在 D 中派生(即,应该只有一个 C 派生实例)。希望在 C 或 B 中可能有一个静态断言可以解决这个问题。

0 投票
4 回答
988 浏览

c++ - 我可以从手动模板实例化中排除一些方法吗?

我们有复杂的模板类,其中一些方法不适用于某些策略或类型。因此,当我们检测到这些类型时(在编译时,使用 type-traits),我们会触发一个带有不错消息的静态断言。

现在我们也做了很多手动模板实例化。部分原因是方法被迫编译器对方法进行语法检查。它还减少了库用户的编译时间。问题是静态断言总是被触发,因此我们不能手动实例化有问题的模板类。

有解决方法吗?

编辑:为了更清楚,这是一个例子(在这种情况下,显式实例化将在 someFunc1() 上失败:

EDIT2:这是另一个例子。这一次你可以编译它,看看我的意思。首先立即编译。代码应该编译。然后取消注释 [2]并且应该触发静态断言。现在注释掉 [2]取消注释 [1]。静态断言将触发,因为您正在显式实例化模板。我想避免删除显式实例化,因为它带来了好处(参见上面的好处)。

0 投票
1 回答
207 浏览

c++ - 这个静态断言会正常工作吗?

我最近看到以下代码:

它会按预期工作(类似BOOST_STATIC_ASSERT)吗?

0 投票
3 回答
222 浏览

c++ - 获取类中静态属性的数量

我有一个仅由静态属性组成的类,充当一种穷人的单身人士。其目的是从应用程序的各个点收集统计信息。对于我们的单元测试,我创建了一个卷影副本,可用于获取生产代码之间的差异。

例子:

由于所有成员都是静态的,影子类不能从生产类继承,并且生产类中的属性是具有副作用的复杂对象,我只希望影子保存简单的值以进行比较。

为了使影子类更易于维护,我想添加一个静态断言来检查每当有人向生产类添加属性时,影子类也会更新。

如果属性不是静态的,这可以通过执行以下操作轻松完成:

除了使类成为非静态类(我不想这样做,因为我必须将生产类变成一个适当的单例)之外,有没有什么办法可以用当前的实现来完成这个检查?

在运行时,我有一个方法可以使用生产类验证阴影中的所有值。由于添加新属性时也必须更新该方法,因此我希望能够计算已验证的属性数量,并在数量与属性总数不同时断言。

例子

如果有一个 GCC 扩展,我可以使用这可能是一个可接受的解决方案,即使我更喜欢可移植的东西。

0 投票
3 回答
5261 浏览

c++ - constexpr、static_assert 和内联

我之前根据参数是否为constexpr. 我正在尝试解决该问题的令人失望的答案,以制作更智能的断言功能。这大致是我想要做的:

基本上,这个想法是编译时检查总是比运行时检查更好,如果可以在编译时检查。但是,由于内联和常量折叠之类的原因,我不能总是知道是否可以进行编译时检查。这意味着在某些情况下可能会assert (condition)编译到assert(false)并且代码只是在等待我运行它并在我发现有错误之前执行该路径。

因此,如果有某种方法可以检查条件是否为 constexpr(由于内联或其他优化),我可以static_assert在可能的情况下调用,否则可以使用运行时断言。幸运的是,gcc 有内在函数,如果是 constexpr __builtin_constant_p (exp),它会返回 true 。exp我不知道其他编译器是否有这个内在,但我希望这能解决我的问题。这是我想出的代码:

依赖于的static_assert短路行为or。如果IS_CONSTEXPR为真,则static_assert可以使用,条件为!true or condition,与just 相同condition。如果IS_CONSTEXPR为假,则static_assert不能使用,条件为!false or condition,与 相同,true忽略static_assert。如果static_assert由于不是 constexpr 而无法检查condition,那么我会在我的代码中添加一个运行时assert作为最后的努力。但是,这不起作用,因为不能在 a 中使用函数参数static_assert即使参数是constexpr.

特别是,如果我尝试使用 gcc 编译会发生这种情况:

g++ main.cpp -std=c++0x -O0

一切正常,编译正常。没有没有优化的内联,所以IS_CONSTEXPR是 false 并且static_assert被忽略,所以我只得到一个运行时assert语句(失败)。然而,

一旦我打开任何优化并因此可能static_assert被触发,它就会失败,因为我不能在static_assert. 有没有办法解决这个问题(即使这意味着实现我自己的static_assert)?我觉得我的 C++ 项目理论上可以从一个更智能的断言语句中获得相当多的好处,该语句可以尽早发现错误。

在一般情况下,制作类似函数的宏似乎smart_assert并不能解决问题。它显然可以在这个简单的示例中工作,但condition可能来自调用图上两级的函数(但constexpr由于内联,编译器仍然知道),这遇到了使用函数参数的相同问题在一个static_assert

0 投票
1 回答
1132 浏览

c++ - static_assert 不能将 const char* 模板参数识别为 constexpr: g++ 错误?

考虑下面的定义。

完整的错误是

../main.cpp:16:3:错误:静态断言的非常量条件

../main.cpp:16:3: 错误:'(((const char*)(& Test::wrong_string)) == ((const char*)(& Test::right_string)))' 不是常量表达式

我相信这是一个编译器错误,因为根据我作为模板参数传递的内容(无论是还是)constexpr,表达式的内在变化是没有意义的。static_assertTest::right_stringTest::right_string

我已经发现 g++ 4.6在将地址作为模板参数处理时有些缺陷。这是同一错误的实例吗?