问题标签 [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++ - constexpr 和返回模板函数的 C++0x 错误
我试图为C++模板非类型参数类型推导的问题找到解决方案,它不涉及调用f的模板参数,而是为模板参数隐式选择正确的类型。
由于constexpr应该保证一个函数只包含编译时常量,并且在编译时进行评估(至少我认为它是这样做的),我认为它可能是这个问题的解决方案。所以我想出了这个:
第一个版本产生以下错误:
这真的很令人困惑,因为在尾随返回类型的 decltype 语句中使用参数应该可以吗?
第二个版本产生以下错误:
这有点令人困惑,因为我完全符合资格f
。get_f
如果我没有constexpr
. 那么我对什么有错误的理解constexpr
,或者 GCC 的 C++0x 实现在这种情况下是否存在缺陷?
我正在使用 GCC 4.6.2
c++ - 我们应该尽可能使用 constexpr 吗?
我们显然不能做所有事情constexpr
。如果我们不做任何事情constexpr
,那么,不会有任何大问题。到目前为止,已经编写了很多没有它的代码。
constexpr
但是,在任何可能拥有它的东西上拍打是个好主意吗?这有什么潜在的问题吗?
c++ - 带运算符的 constexpr|=
我尝试使用 C++0x constexpr 编写一个函数,该函数返回一个仅包含输入集最高位的整数。
这会导致使用 gcc 4.6.1 的编译时失败。
请注意,它可以在没有 constexpr 关键字的情况下工作。
我的问题是:
为什么这不起作用?我可以看到 operator|= 不是 constexpr,但它对内置类型有影响吗?
有没有一种简单的方法可以将此函数编写为 constexpr?我希望它在运行时合理高效,并且我有点关心可读性。
c++ - C++ 中的函数调用常量传播
我无法通过搜索找到答案,所以下一步是询问。假设我有一些这样的代码:
如果我像这样调用代码,onbit(A, 4)
常量4
会被传播并优化,还是应该将其设为模板 ( template<int n, class Int>
) 以使其成为常量。这里是否需要 C++0x constexpr,如果需要,我应该如何使用它(应该int n
是 const 还是 constexpr?)。
我知道 constexpr 可以使用常量参数,但是如果部分参数是常量而部分是可变的,它会部分优化吗?
总结:一个函数(它必须是内联的,对吗?)是否可以通过常量传播进行部分优化,如果可以,这样做的要求是什么?
即使在我写这篇文章的时候,我也在想一个内联函数调用会传播常量......
c++ - constexpr 问题,为什么这两个不同的程序在 g++ 中运行的时间如此不同?
我正在使用 gcc 4.6.1,并且得到了一些涉及调用constexpr
函数的有趣行为。该程序运行良好,并立即打印出来12200160415121876738
。
这个程序需要永远运行,我从来没有耐心等待它打印出一个值:
为什么会有如此巨大的差异?我在第二个程序中做错了吗?
编辑:我在g++ -std=c++0x -O3
64 位平台上编译它。
c++ - 简单的可变参数模板函数无法实例化
我知道这会sizeof...(Args...)
产生 C++0x 打包模板参数列表中的类型数量,但我想根据其他功能来实现它以进行演示,但它不会编译。
这个错误*HERE*
与
即它没有看到首先定义的基本情况。前向声明template<typename...T>num_args();
在重载决议中引入了歧义。
我正在使用 gcc 4.6。我怎样才能使这项工作?
谢谢。
c++ - 内联与 constexpr?
使用新的 C++11 标准,何时应该使用inline
关键字而不是constexpr
关键字?constexpr
关键字是否提供了任何额外的优化inline
,或者它只是断言必须在编译时计算事物?
为什么constexpr
在调用不是常量的某些情况下(例如调用foo(x)
非constexpr
变量)在 GCC 上工作?这是 GCC 中的错误还是实际上是标准的一部分?
c++11 - C ++ 11:静态断言()中的std :: max(a,b)?
我注意到,在最后一个 C++-Std Doc N3291 的 [24.4.7] 中max
不是constexpr
:
因此,不允许在static_assert
示例中使用它。正确的?
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 来说是新的。
c++ - 由于定义顺序,“令人惊讶”的常量初始化
在阅读有关 constexpr 的幻灯片时,介绍是关于“使用 consts 的令人惊讶的动态初始化”。例子是
唉,音轨不见了,笔记也不见了,所以我只能猜测这里的意思。
d
动态初始化“令人惊讶”是否正确,因为之前S::c
定义过 d
?is before的声明可能还不够,编译器需要完整的定义,对吧?S::c
d
也就是说,我怀疑,在下面的例子中d
会被静态初始化吗?
为了获得蛋糕,在 C++11 中,完全静态初始化需要什么?constexpr
S::c
,d
或两者兼而有之?