问题标签 [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 回答
2095 浏览

c++ - constexpr 和返回模板函数的 C++0x 错误

我试图为C++模板非类型参数类型推导的问题找到解决方案,它不涉及调用f的模板参数,而是为模板参数隐式选择正确的类型。

由于constexpr应该保证一个函数只包含编译时常量,并且在编译时进行评估(至少我认为它是这样做的),我认为它可能是这个问题的解决方案。所以我想出了这个:

第一个版本产生以下错误:

这真的很令人困惑,因为在尾随返回类型的 decltype 语句中使用参数应该可以吗?

第二个版本产生以下错误:

这有点令人困惑,因为我完全符合资格fget_f如果我没有constexpr. 那么我对什么有错误的理解constexpr,或者 GCC 的 C++0x 实现在这种情况下是否存在缺陷?

我正在使用 GCC 4.6.2

0 投票
4 回答
2784 浏览

c++ - 我们应该尽可能使用 constexpr 吗?

我们显然不能做所有事情constexpr。如果我们不做任何事情constexpr,那么,不会有任何大问题。到目前为止,已经编写了很多没有它的代码。

constexpr但是,在任何可能拥有它的东西上拍打是个好主意吗?这有什么潜在的问题吗?

0 投票
2 回答
716 浏览

c++ - 带运算符的 constexpr|=

我尝试使用 C++0x constexpr 编写一个函数,该函数返回一个仅包含输入集最高位的整数。

这会导致使用 gcc 4.6.1 的编译时失败。

请注意,它可以在没有 constexpr 关键字的情况下工作。

我的问题是:

为什么这不起作用?我可以看到 operator|= 不是 constexpr,但它对内置类型有影响吗?

有没有一种简单的方法可以将此函数编写为 constexpr?我希望它在运行时合理高效,并且我有点关心可读性。

0 投票
3 回答
860 浏览

c++ - C++ 中的函数调用常量传播

我无法通过搜索找到答案,所以下一步是询问。假设我有一些这样的代码:

如果我像这样调用代码,onbit(A, 4)常量4会被传播并优化,还是应该将其设为模板 ( template<int n, class Int>) 以使其成为常量。这里是否需要 C++0x constexpr,如果需要,我应该如何使用它(应该int n是 const 还是 constexpr?)。

我知道 constexpr 可以使用常量参数,但是如果部分参数是常量而部分是可变的,它会部分优化吗?

总结:一个函数(它必须是内联的,对吗?)是否可以通过常量传播进行部分优化,如果可以,这样做的要求是什么?

即使在我写这篇文章的时候,我也在想一个内联函数调用会传播常量......

0 投票
4 回答
900 浏览

c++ - constexpr 问题,为什么这两个不同的程序在 g++ 中运行的时间如此不同?

我正在使用 gcc 4.6.1,并且得到了一些涉及调用constexpr函数的有趣行为。该程序运行良好,并立即打印出来12200160415121876738

这个程序需要永远运行,我从来没有耐心等待它打印出一个值:

为什么会有如此巨大的差异?我在第二个程序中做错了吗?

编辑:我在g++ -std=c++0x -O364 位平台上编译它。

0 投票
2 回答
624 浏览

c++ - 简单的可变参数模板函数无法实例化

我知道这会sizeof...(Args...)产生 C++0x 打包模板参数列表中的类型数量,但我想根据其他功能来实现它以进行演示,但它不会编译。

这个错误*HERE*

即它没有看到首先定义的基本情况。前向声明template<typename...T>num_args();在重载决议中引入了歧义。

我正在使用 gcc 4.6。我怎样才能使这项工作?

谢谢。

0 投票
3 回答
12529 浏览

c++ - 内联与 constexpr?

使用新的 C++11 标准,何时应该使用inline关键字而不是constexpr关键字?constexpr关键字是否提供了任何额外的优化inline,或者它只是断言必须在编译时计算事物?

为什么constexpr在调用不是常量的某些情况下(例如调用foo(x)constexpr变量)在 GCC 上工作?这是 GCC 中的错误还是实际上是标准的一部分?

0 投票
2 回答
599 浏览

c++11 - C ++ 11:静态断言()中的std :: max(a,b)?

我注意到,在最后一个 C++-Std Doc N3291 的 [24.4.7] 中max不是constexpr

因此,不允许在static_assert示例中使用它。正确的?

0 投票
2 回答
2407 浏览

c++ - 字符串文字可以在常量表达式中下标吗?

这是有效的,因为constexpr允许表达式采用“引用使用 constexpr 定义的非易失性对象或引用此类对象的子对象的文字类型的左值”(第 5.19/2 节)的值):

但是,字符串文字似乎不符合以下描述:

2.14.5/8 描述了字符串字面量的类型:

普通字符串文字和 UTF-8 字符串文字也称为窄字符串文字。窄字符串文字的类型为“n const char 数组”,其中 n 是字符串的大小,定义如下,并且具有静态存储持续时间。

似乎这种类型的对象可以被索引,只要它是临时的而不是静态存储持续时间(5.19/2,就在上面的片段之后):

[constexpr允许左值到右值的转换] ...一个字面量类型的左值,它引用一个非易失性临时对象,其生命周期尚未结束,用常量表达式初始化

这特别奇怪,因为获取临时对象的左值通常是“作弊”。我想这条规则适用于引用类型的函数参数,例如

对于它的价值,GCC 4.7 接受get_1( "hello" ),但拒绝,"hello"[1]因为“'._0' 的值在常量表达式中不可用”......但作为案例标签或数组绑定"hello"[1] 是可以接受的。

我在这里分裂了一些标准的头发......分析是否正确,这个功能是否有一些设计意图?

编辑:哦……这有一些动机。似乎这种表达式是在预处理器中使用查找表的唯一方法。例如,这引入了一个代码块,除非SOME_INTEGER_FLAG是 1 或 5,否则它会被忽略,如果大于 6,则会导致诊断:

这个结构对于 C++11 来说是新的。

0 投票
4 回答
998 浏览

c++ - 由于定义顺序,“令人惊讶”的常量初始化

在阅读有关 constexpr 的幻灯片时,介绍是关于“使用 consts 的令人惊讶的动态初始化”。例子是

唉,音轨不见了,笔记也不见了,所以我只能猜测这里的意思。

d动态初始化“令人惊讶”是否正确,因为之前S::c定义 dis before的声明可能还不够,编译器需要完整的定义对吧?S::cd

也就是说,我怀疑,在下面的例子中d 被静态初始化吗?

为了获得蛋糕,在 C++11 中,完全静态初始化需要什么?constexprS::cd或两者兼而有之?