问题标签 [constexpr]

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 投票
1 回答
2185 浏览

c++ - C++11 constexpr 过时的模板元编程?

据我了解,constexpr与模板元编程不同,图灵不完整,所以我相信这些是不一样的。所以问题是模板元编程在多大程度上constexpr过时了?

0 投票
1 回答
2801 浏览

c++ - constexpr 和奇怪的错误

我有:

我收到错误:

关于为什么的任何想法?

0 投票
3 回答
2252 浏览

c++ - 使用具有递归定义类型的 C++11 initializer_list 使用 constexpr

是否可以使用 C++11initializer_list来组装递归定义的类,例如Foo,使用constexpr构造函数:

我可以初始化一个Foo<3>使用:

最好使用 Foo<3> a = {1,2,3} 代替。如果有一个constexpr tail功能,initializer_list我认为它应该可以工作。

0 投票
3 回答
4976 浏览

c++ - 如何告诉 static_assert constexpr 函数参数是 const?

我有一个看起来像这样的 constexpr 函数:

但是,用 GCC 4.6.3 编译它一直告诉我

错误:“bar”不能出现在常量表达式中

我尝试了类似的东西

但 constexpr 不能用于函数参数。

是否有一些简单的方法可以告诉编译器 bar 始终是编译时间常数?

0 投票
1 回答
2256 浏览

c++ - constexpr(gcc) 出错 - 错误:在“{”标记之前不允许使用大括号括起来的初始化程序

用 gcc 编译会报错:

错误:在“{”标记之前不允许使用大括号括起来的初始化程序

这是非法使用 constexpr 吗?

编辑

我尝试了 3 个不同版本的 gcc,它在我拥有的最新 4.7.0 上编译(我刚刚下载了它,我正在使用 mingw-w64),所以它看起来是一个固定的错误(错误的链接是不过不错!)。

4.7.0 20120311 (prerelease) // 好的
4.6.4 20120305 (prerelease) // 错误
4.7.0 20110829 (experimental) // 错误

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 投票
2 回答
8654 浏览

c++ - constexpr 指针值

我正在尝试声明一个初始化为某个常量整数值的 constexpr 指针,但是 clang 正在挫败我的所有尝试:

尝试1:

尝试2:

尝试 3:

我试图做的事情是设计不允许的吗?如果是这样,为什么?如果没有,我该怎么做?

注意:gcc 接受所有这些。

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在将地址作为模板参数处理时有些缺陷。这是同一错误的实例吗?

0 投票
2 回答
7666 浏览

c++ - C++11 constexpr 字符串实现

有没有办法实现字符串在编译时和运行时都可以工作?

AFAIK 对于要构造的 constexpr 类,它需要有一个微不足道的析构函数。然而,当我们处理字符串时,这被证明是困难的。如果字符串不是 constexpr,那么它需要释放内存。但是,如果它是 constexpr,那么它是静态分配的,不应该被删除,从而允许一个微不足道的析构函数。

但是,不可能说“嘿,编译器!如果我是 constexpr,你就不需要破坏我!” 或者是吗?

这将类似于以下内容:

我能做到的最接近的是有两种不同的类型,string 和 constexpr_string,一个用户定义的文字 _string 返回 constexpr_string,以及一个用户定义的从 constexpr_string 到 string 的隐式转换。

虽然这不是很好,但可以const auto s = "asdf"_string;正常工作但const string s = "asdf"_string;不能。此外,指向 constexpr_string 的引用/指针不会转换。无论哪种方式的继承都会导致不直观的“陷阱”,并且不能解决第一个问题。

这似乎应该是可能的,只要编译器相信程序员不需要破坏 constexpr。

如果我有误解,请告诉我。

0 投票
1 回答
3106 浏览

c++ - 用 constexpr 初始化数组?

我想知道是否可以使用 constexpr 函数(使用 C++ 2011)初始化整个数组。在这里,我有一些东西可以说明我想做的事情:

有没有办法用 constexpr 初始化 myVar 而无需手动填充数组。如果它存在,给定示例的语法是什么?

为了稍微精确一点,我寻找一种方法来使用单个函数调用来填充 myVar 的所有值。