问题标签 [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.
c++ - C++11 constexpr 过时的模板元编程?
据我了解,constexpr
与模板元编程不同,图灵不完整,所以我相信这些是不一样的。所以问题是模板元编程在多大程度上constexpr
过时了?
c++ - constexpr 和奇怪的错误
我有:
我收到错误:
关于为什么的任何想法?
c++ - 使用具有递归定义类型的 C++11 initializer_list 使用 constexpr
是否可以使用 C++11initializer_list
来组装递归定义的类,例如Foo
,使用constexpr
构造函数:
我可以初始化一个Foo<3>
使用:
最好使用 Foo<3> a = {1,2,3} 代替。如果有一个constexpr tail
功能,initializer_list
我认为它应该可以工作。
c++ - 如何告诉 static_assert constexpr 函数参数是 const?
我有一个看起来像这样的 constexpr 函数:
但是,用 GCC 4.6.3 编译它一直告诉我
错误:“bar”不能出现在常量表达式中
我尝试了类似的东西
但 constexpr 不能用于函数参数。
是否有一些简单的方法可以告诉编译器 bar 始终是编译时间常数?
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) // 错误
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
。
c++ - constexpr 指针值
我正在尝试声明一个初始化为某个常量整数值的 constexpr 指针,但是 clang 正在挫败我的所有尝试:
尝试1:
尝试2:
尝试 3:
我试图做的事情是设计不允许的吗?如果是这样,为什么?如果没有,我该怎么做?
注意:gcc 接受所有这些。
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_assert
Test::right_string
Test::right_string
我已经发现 g++ 4.6在将地址作为模板参数处理时有些缺陷。这是同一错误的实例吗?
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。
如果我有误解,请告诉我。
c++ - 用 constexpr 初始化数组?
我想知道是否可以使用 constexpr 函数(使用 C++ 2011)初始化整个数组。在这里,我有一些东西可以说明我想做的事情:
有没有办法用 constexpr 初始化 myVar 而无需手动填充数组。如果它存在,给定示例的语法是什么?
为了稍微精确一点,我寻找一种方法来使用单个函数调用来填充 myVar 的所有值。