问题标签 [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 投票
3 回答
5610 浏览

c++ - 如何检查模板参数是否为 2 的幂?

我想创建一个静态分配2^N 字节数组的结构,但我不希望此结构的用户将此大小指定为指数。例子:

我如何检查此模板参数是否为 2 的幂,通过有关此的好消息警告用户?

我已经能够使用一个简单的模板来检查这一点:

但是,我无法用理智的消息警告用户。有任何想法吗?

编辑

修正了模棱两可的例子。

编辑

1 确实是 2 的幂。解决了这个问题!:)

编辑

使用 BOOST_STATIC_ASSERT,我在 GCC 中收到此代码的编译错误:

错误

http://ideone.com/cMfEf

编辑

哦,我明白了。这是断言失败时我应该得到的消息。但这并没有给用户一些理智的信息。:(

0 投票
2 回答
2272 浏览

c++ - 在默认模板参数中调用 constexpr

在 C++11 中,我使用 constexpr 函数作为模板参数的默认值 - 它看起来像这样:

G++ 4.5 和 4.7 编译了这个,但 Clang++ 3.1 没有。来自 clang 的错误消息是:

哪一个是正确的?

0 投票
2 回答
1711 浏览

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。所以我想我暂时被这个错误所困扰。:(

0 投票
3 回答
165 浏览

c++ - 为什么 Foo::innerConsexpr 不会链接,但 UserLiteral{Foo::innerConsexpr} 会?

考虑以下简单的类,这些类是我根据我在实际项目中看到的问题设计的。constexprTriple 是与Foo 类中的内部 s 一起使用的快速样板类型:

如果我随后编写一个main()函数来使用来自 的公共内部constexprs Foo,如下所示,它将无法链接(使用 g++ 4.7.0,在 Windows 7 上通过 mingw-x86-64 的方式):

但是,如果我写

而不是简单地

它将链接并运行良好。我可以看到前者更明确地表达了编译时文字的意图,但我仍然很惊讶后者不能正常工作。这是一个编译器错误,还是基于规则的原因constexpr,只有第一个示例才能工作?

我会尝试其他编译器以获得更多见解,但目前 GCC 4.7.0 是我唯一可以访问的支持constexpr.

另请注意,pod 的表达式在constexpr没有显式文字包装的情况下可以正常工作,例如cout << Foo::defaultPOD从未给我带来麻烦。

0 投票
1 回答
482 浏览

c++ - GCC 4.7.1 泛化常量表达式重载问题

我尝试使用模板专业化来实现编译时算法选择。

我散列以下代码:

我已经将这种结构专门用于char类型:

但是当我尝试编译它时,GCC 4.7.1 出现以下错误:

错误:字段初始值设定项不是常量

我认为问题来自fnv_1a_32_hash函数重载的事实,即使 IMO 隐式转换size_t (*)(const char*)应该处理这个问题。

我终于找到了一种解决方法,通过重命名重载或简单地转换分配:

我的问题是:这是编译器错误吗?还是我错过了什么?请在需要的地方解释和引用规范。


fnv_1a_32_hash 实现细节:

0 投票
1 回答
1791 浏览

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... };

编辑:等等,没关系,我脑子有问题。上面的行工作正常......

这是代码答案

非常感谢您的宝贵时间!

0 投票
4 回答
34106 浏览

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 开发人员真正让它工作
  • 根据规范,我想要的信息是不可能的,最好有一些关于这个限制背后的理由的信息

也欢迎其他有用的答案,但可能不会那么容易被接受。

0 投票
2 回答
7319 浏览

c++ - lambda 作为静态成员

我正在尝试使用 lambda 作为静态成员,如下所示:

这甚至是正确的 C++11 代码吗?在铿锵声中,我收到此错误:

在 clang 中,lambda 似乎不被视为常量表达式。它是否正确?也许他们还没有在 clang 中完全实现 lambdas,因为 gcc 4.7 似乎允许它作为 a constexpr,但它给出了另一个错误:

我不确定,我明白这意味着什么。它似乎正确地推断出 lambda 的类型,但它只声明它而不定义它。我将如何定义它?

0 投票
2 回答
1167 浏览

c++ - 在编译时计算小整数的阶乘

我刚刚(再次)实现了一个递归模板,用于在编译时计算整数的阶乘(谁会想到有一天我会真正需要它!)。尽管如此,我并没有自己动手,而是去Boost寻找答案。但是,特殊数学中的阶乘函数特别禁止它与整数类型一起使用,所以我只写了自己的。

不过,我应该使用 Boost 中的另一个功能吗?我应该将整数转换为double并使用该boost::factorial函数吗?计算是在编译时执行的吗?

0 投票
2 回答
199 浏览

c++ - 如何在其值可用于常量表达式的类中初始化数组?

我想知道如何在一个类中初始化一个数组,其值可以在常量表达式中使用。这是我的问题的解释:

在 C++ 2011 中有什么方法可以做到这一点吗?(可能使用 constexpr 或元编程?)

非常感谢 !

编辑:正如标题指定的那样,我需要array成为该类的成员(不是全局数组)。