问题标签 [c++14]

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 回答
3862 浏览

c++ - 将元素添加到 STL 容器的背面

我正在寻找一种将元素添加到 STL 容器背面的通用方法。我希望代码支持尽可能多类型的 STL 容器。下面的一段代码演示了我的问题:

这里的问题很微妙。这段代码对vectors 很有效,因为std::vector它实现了emplace函数。但std::string没有!有没有更通用的方法来执行相同的操作?

0 投票
2 回答
19443 浏览

c++ - __builtin_ctz(0) 或 __builtin_clz(0) 的未定义程度如何?

背景

很长一段时间以来,gcc 一直提供许多内置的位旋转函数,特别是尾随和前导 0 位的数量(也用于long unsignedand long long unsigned,后缀为land ll):

— 内置功能:int __builtin_clz (unsigned int x)

返回 中前导 0 位的数量x,从最高有效位位置开始。如果x为 0,则结​​果未定义。

— 内置功能:int __builtin_ctz (unsigned int x)

返回 中尾随 0 位的数量x,从最低有效位位置开始。如果x为 0,则结​​果未定义。

然而,在我测试的每个在线(免责声明:仅限 x64)编译器上,结果都是两者都clz(0)返回ctz(0)底层内置类型的位数,例如

活生生的例子

尝试的解决方法

最新的 Clang SVN 主干std=c++1y模式使所有这些函数都放松了 C++14 constexpr,这使得它们可以在 SFINAE 表达式中使用,用于围绕 3 ctz/clz内置函数的包装函数模板unsignedunsigned longunsigned long long

这个 hack 的好处是,提供所需结果的平台ctz(0)可以省略一个额外的条件来测试x==0(这似乎是一个微优化,但是当你已经降到内置位旋转函数的水平时,它可以使差别很大)

问题

内置函数系列clz(0)和的未定义程度如何ctz(0)

  • 他们可以抛出std::invalid_argument异常吗?
  • 对于 x64,它们对于当前的 gcc 发行版会返回底层类型的大小吗?
  • ARM/x86 平台有什么不同吗(我无权测试这些平台)?
  • 上述 SFINAE 技巧是分离此类平台的明确方法吗?
0 投票
4 回答
1713 浏览

c++ - typedef 向量

是否有可能以任何方式在C++11/14中拥有类型(def)的向量?

我尝试的第一件事是拥有一个基类的向量,并以某种方式从它的派生形式中获取 typedef,但无论我尝试什么,我都无法让它工作(最不可能)。

伪 C++:

0 投票
2 回答
1633 浏览

c++ - 什么是 std::numeric_limits::digits 应该代表什么?

我正在编写一个类似整数的类,它表示一个位于某个范围内的值。例如, 的值bounded::integer<0, 10>在 [0, 10] 范围内。对于这个类,我定义radix2.

的价值应该是digits什么bounded::integer<-100, 5>

怎么样bounded::integer<16, 19>

0 投票
3 回答
932 浏览

c++ - 如何存储多态闭包?

C++1y 提供多态 lambda(即,auto作为参数类型的一部分使用):

存储 lambda 生成的闭包很容易,如图所示:只需使用一个auto变量。但是假设我想创建一个vector这样的对象。vector持有什么类型的?通常的答案是使用std::function,但这在这种情况下不起作用,因为 AFAIK 没有 polymorphic 之类的东西std::function,即,这在 C++1y 中是不合法的:

如果这是合法的,那么您可以做一些事情,比如创建一个回调容器,每个回调容器都可以使用任何一组参数调用,并且每个回调都可以返回一个依赖于传递的参数类型的类型。auto至少在理论上,任何给定回调的结果都可以存储在变量中。

两个问题:

  • 在 C++1y 中有没有办法声明一个变量或容器可以容纳不同类型的多态 lambdas(除了类似的东西boost::any)?
  • 希望这样的事情成为可能是否合理,或者这种事情与静态类型不兼容?
0 投票
2 回答
166 浏览

c++ - 模板类型定义数组初始化

我有一个数组,我想根据模板参数将其初始化为 constexpr(我认为这将需要 c++14,因为我设想答案需要初始化列表作为 constexpr)。

假设我有一个模板

在哪里

现在,我可以使用 type_traits std::extent 递归地提取数组大小

我最终想做的是生成一个 constexpr 成员,其中 T 的维度作为 myarray 的元素

我已经看到了使用可变参数模板 ref 初始化数组的好方法:如何使用初始化列表构造 std::array 对象?

问题是,如何在给定 T?1 的情况下生成具有 T 维度的初始化列表或可变参数模板

0 投票
1 回答
1295 浏览

c++ - 不推荐使用模板别名(类型别名,使用)的模板化类名?

我想重命名一个模板类。为了使用户的过渡更容易,我想将旧类保留为另一个版本,并使用 GCC / Clang 的扩展将其标记为已弃用(不推荐使用属性)。为了避免保留已弃用类的精确副本,使用模板别名会很方便。不幸的是,它似乎不起作用。这是我在 Clang 3.3、GCC 4.7 和 GCC 4.8 中尝试过的:

我错过了什么还是编译器不支持它?是否有其他想法可以在不复制整个班级的情况下获得弃用警告?

0 投票
2 回答
147 浏览

c++ - 变量模板变量可能会有所不同吗?

C++14 草案增加了对变量模板的支持。提案(N3651)中的示例都显示了常量(constexprconst),但据我所知,这不是必需的。变量模板变量是否可以改变,例如,被分配给?

0 投票
1 回答
359 浏览

c++ - 类方法的返回类型推导?C++1y

c++14 中的成员函数是否允许返回类型推导,还是只允许自由函数?

我问是因为我隐含地假设它会起作用,但是在 gcc 4.8.1 中我得到一个内部编译器错误(“in gen_type_die_with_usage”)。我第一次遇到这样神秘的错误,所以我有点怀疑;我知道他们从那时起改变了规范。

为清楚起见,这对我有用:

但这不是:

这在标准草案中是否允许?

0 投票
3 回答
115 浏览

c++ - 在本地定义的结构中模拟非本地(或自由)变量

这个问题可能只对了解支持闭包的编程语言的人有意义。如果您不这样做,请不要评论“您为什么要这样做?”:这样做有很多正当理由。

在函数式语言中,定义捕获已经定义的局部变量的局部函数是很常见的。在 C++ 中,这看起来像(但当然是非法的):

为了实现这一点,C++11 引入了lambda 函数,因此实际上可以以一种相当不错的方式来实现它(虽然,不像函数式语言中那样好 ;-)):

我的问题是:现在可以通过引用来自动捕获函数的自由变量,对于本地定义的结构来说这不是很好吗?理想情况下,我希望能够写:

我发现的唯一解决方法是将所有非本地(自由)变量作为参数手动传递给构造函数,当它们很多时,这有点痛苦:

您是否知道任何其他解决方法可以避免手动将所有自由变量作为参数传递,或者您是否知道这些“环境感知”本地定义的结构是否被考虑用于 C++ 的未来扩展?(即,C++1y?)