问题标签 [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++ - 如何检查模板参数是否为 2 的幂?
我想创建一个静态分配2^N 字节数组的结构,但我不希望此结构的用户将此大小指定为指数。例子:
我如何检查此模板参数是否为 2 的幂,并通过有关此的好消息警告用户?
我已经能够使用一个简单的模板来检查这一点:
但是,我无法用理智的消息警告用户。有任何想法吗?
编辑
修正了模棱两可的例子。
编辑
1 确实是 2 的幂。解决了这个问题!:)
编辑
使用 BOOST_STATIC_ASSERT,我在 GCC 中收到此代码的编译错误:
错误
编辑
哦,我明白了。这是断言失败时我应该得到的消息。但这并没有给用户一些理智的信息。:(
c++ - 在默认模板参数中调用 constexpr
在 C++11 中,我使用 constexpr 函数作为模板参数的默认值 - 它看起来像这样:
G++ 4.5 和 4.7 编译了这个,但 Clang++ 3.1 没有。来自 clang 的错误消息是:
哪一个是正确的?
c++ - 如何让 GCC 在 ROM 中放置 C++ constexpr?
我为 LPC1114 编译,这是一个小型 ARM(实际上是 Cortex)目标。RAM 比 ROM 受限得多。我使用最新的 Mentor (CodeBenchLite) GCC 编译器 (GCC 4.6.3)。我有一些我想在 ROM 中拥有的常量对象。据我了解,下面代码中的 ffx 对象应该以 ROM(代码)结尾,而是放在 DATA 中。
如何说服编译器预先计算对象并将其放入 ROM 中?
或者我应该问:
- 我能以某种方式期望 G++ 编译器为 ffx 生成 ROMable 数据吗
- 如果是这样,我的代码是否正确
- 如果是这样,它支持哪个 G++ 版本(我使用 4.6,也许我需要 4.7?)
========================================
这个 bugzilla 条目c++/49673似乎表明我的问题是一个已知问题,可能已在 GCC 4.7 中修复。不幸的是,我更喜欢使用 Mentor/CodeSourcery,它仍然是 4.6.3。所以我想我暂时被这个错误所困扰。:(
c++ - 为什么 Foo::innerConsexpr 不会链接,但 UserLiteral{Foo::innerConsexpr} 会?
考虑以下简单的类,这些类是我根据我在实际项目中看到的问题设计的。constexpr
Triple 是与Foo 类中的内部 s 一起使用的快速样板类型:
如果我随后编写一个main()
函数来使用来自 的公共内部constexpr
s Foo
,如下所示,它将无法链接(使用 g++ 4.7.0,在 Windows 7 上通过 mingw-x86-64 的方式):
但是,如果我写
而不是简单地
它将链接并运行良好。我可以看到前者更明确地表达了编译时文字的意图,但我仍然很惊讶后者不能正常工作。这是一个编译器错误,还是基于规则的原因constexpr
,只有第一个示例才能工作?
我会尝试其他编译器以获得更多见解,但目前 GCC 4.7.0 是我唯一可以访问的支持constexpr
.
另请注意,pod 的表达式在constexpr
没有显式文字包装的情况下可以正常工作,例如cout << Foo::defaultPOD
从未给我带来麻烦。
c++ - GCC 4.7.1 泛化常量表达式重载问题
我尝试使用模板专业化来实现编译时算法选择。
我散列以下代码:
我已经将这种结构专门用于char
类型:
但是当我尝试编译它时,GCC 4.7.1 出现以下错误:
错误:字段初始值设定项不是常量
我认为问题来自fnv_1a_32_hash
函数重载的事实,即使 IMO 隐式转换size_t (*)(const char*)
应该处理这个问题。
我终于找到了一种解决方法,通过重命名重载或简单地转换分配:
我的问题是:这是编译器错误吗?还是我错过了什么?请在需要的地方解释和引用规范。
fnv_1a_32_hash 实现细节:
c++ - 用 Pattern 初始化 `constexpr` 数组
我想constexpr
用使用可变参数模板参数生成的模式初始化一个数组。为简单起见,考虑使用constexpr unsigned
类型列表的大小初始化静态数组的问题,例如unsigned, short, char, int, long
. 我怎样才能做到这一点,以便在编译期间完成所有计算?我需要解决方案才能很好地使用 C++ 类型系统,所以我不能使用宏。
我能想到的最好的结果如下所示,但使用 并且工作正常。g++ -std=c++11 -Wall -Ofast -S
(使用 g++ 4.7)进行编译和检查程序集清楚地表明,这些值在运行时被推入堆栈。有任何想法吗?
如果我能以某种方式告诉扩展n +1关于扩展n,则使用如下的数组初始化程序将起作用。
static constexpr unsigned foo[] = { compute_element<Args>::value... };
编辑:等等,没关系,我脑子有问题。上面的行工作正常......
这是代码答案:
非常感谢您的宝贵时间!
c++ - constexpr 使用静态函数初始化静态成员
要求
我想要一个从函数constexpr
计算的值(即编译时常量) 。constexpr
我希望这两个范围都在一个类的命名空间内,即一个静态方法和一个类的静态成员。
第一次尝试
我首先以(对我而言)显而易见的方式写了这个:
g++-4.5.3 -std=gnu++0x
说:
g++-4.6.3 -std=gnu++0x
抱怨:
第二次尝试
好吧,我想,也许我必须把东西移出课堂。所以我尝试了以下方法:
g++-4.5.3
将毫无怨言地编译。不幸的是,我的其他代码使用了一些基于范围的for
循环,所以我必须至少有 4.6。现在我仔细查看支持列表,似乎constexpr
也需要 4.6。我g++-4.6.3
得到
这对我来说听起来很奇怪。这里的“不同constexpr
”有何不同?我不想添加-fpermissive
,因为我更喜欢严格检查我的其他代码。将foo
实现移到类主体之外没有明显的效果。
预期答案
有人可以解释这里发生了什么吗?我怎样才能实现我正在尝试做的事情?我主要对以下类型的答案感兴趣:
- 在 gcc-4.6 中进行这项工作的一种方法
- 观察到后来的 gcc 版本可以正确处理其中一个版本
- 一个指向规范的指针,根据该规范,我的至少一个构造应该可以工作,这样我就可以让 gcc 开发人员真正让它工作
- 根据规范,我想要的信息是不可能的,最好有一些关于这个限制背后的理由的信息
也欢迎其他有用的答案,但可能不会那么容易被接受。
c++ - lambda 作为静态成员
我正在尝试使用 lambda 作为静态成员,如下所示:
这甚至是正确的 C++11 代码吗?在铿锵声中,我收到此错误:
在 clang 中,lambda 似乎不被视为常量表达式。它是否正确?也许他们还没有在 clang 中完全实现 lambdas,因为 gcc 4.7 似乎允许它作为 a constexpr
,但它给出了另一个错误:
我不确定,我明白这意味着什么。它似乎正确地推断出 lambda 的类型,但它只声明它而不定义它。我将如何定义它?
c++ - 在编译时计算小整数的阶乘
我刚刚(再次)实现了一个递归模板,用于在编译时计算整数的阶乘(谁会想到有一天我会真正需要它!)。尽管如此,我并没有自己动手,而是去Boost寻找答案。但是,特殊数学中的阶乘函数特别禁止它与整数类型一起使用,所以我只写了自己的。
不过,我应该使用 Boost 中的另一个功能吗?我应该将整数转换为double
并使用该boost::factorial
函数吗?计算是在编译时执行的吗?
c++ - 如何在其值可用于常量表达式的类中初始化数组?
我想知道如何在一个类中初始化一个数组,其值可以在常量表达式中使用。这是我的问题的解释:
在 C++ 2011 中有什么方法可以做到这一点吗?(可能使用 constexpr 或元编程?)
非常感谢 !
编辑:正如标题指定的那样,我需要array
成为该类的成员(不是全局数组)。