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

c++ - 用户声明的默认构造函数 + 类内初始化器!= 用户提供的构造函数?

Clang 文档巧妙地解释了

如果一个类或结构没有用户定义的默认构造函数,C++ 不允许你像这样默认构造它的 const 实例([dcl.init],p9)

基本原理是,如果 const 对象未正确初始化,则以后无法更改。下面的代码只有一个用户声明的默认构造函数Test,但它的所有成员都有类内初始化器,

所以用户提供默认构造函数的理由对我来说似乎是多余的。事实上,g++ 4.8.1 确实可以毫无问题地编译它(在线示例),尽管Clang <= 3.2没有。

问题:为什么完整的类内初始化器 + 用户声明的默认构造函数的组合不足以默认构造一个 const 对象?C++14 标准是否正在进行修复?

更新:任何人都可以尝试使用 Clang 3.3 / 3.4 来查看与 Clang 3.2 相比是否已修复此问题?

0 投票
2 回答
11246 浏览

c++ - How to move from std::optional

Consider the following example where we parse data and pass the result to the next function:

Now let's change the code using std::optional to handle a failed parsing step:

Is it valid to move from optional<T>::value()? If it's ok for std::optional is it valid for boost::optional as well?

0 投票
2 回答
1218 浏览

c++ - auto 对编译时间的影响

我们在 C++11 中获得的新 auto 关键字对我来说看起来很模板化,所以我的问题是 - 它会导致与模板相同的编译时间膨胀吗?

关于多态 lambda 的相同问题:

这本质上是一个模板 lambda - 这会影响编译时间吗?

0 投票
2 回答
1248 浏览

c++ - SFINAE 和 decltype(自动)

如果一个函数模板返回decltype(auto)(或另一个使用 的类型说明符auto)但返回语句格式不正确,SFINAE 会导致结果吗?该return语句是否被认为是函数签名的直接上下文?

N3690 草案中似乎没有任何要求。默认情况下,我猜 SFINAE 不适用。

这似乎很不幸,因为您可以编写一个函数来转发到另一个函数,但是您不能像以手写方式编写时那样使其存在以委托为条件。此外,无法检查对等非静态成员函数的存在,decltype(auto)因为this不能在函数签名中使用。然而,这表明了一个基本问题,因为decltype(auto)它提供了一条路径,可以在成员签名中将类类型视为完整,而事实并非如此。

有没有写过提案,或者有没有在任何地方正式分析过问题?

在成员签名中将类类型视为完整的能力可能具有其他含义……但这只是另一个问题的素材。

0 投票
3 回答
306 浏览

c++ - 区分右值视图和右值容器

我正在编写一些基于容器或可迭代的算法。for( : )基本上,我对支持样式迭代的对象进行操作(我很少for( : )直接使用,但遵循它如何查找beginend迭代器)。

std库中,大多数可迭代对象都是容器。他们都拥有自己的数据,并让您查看。

当算法通过右值引用获取容器时,这意味着容器的内容也可以自由获取。例如,如果我写concatinate了两个vectors 并返回第三个,如果两个vectors 都是moved,我们将希望重用第一个,vector然后使用move_iterators 从第二个中取出数据vector以提高效率。

但是,对于概念上相似的 C++1ystring_view和类型,我们拥有不是容器的可迭代对象,而是容器中的视图。从语义上讲,我相信视图的行为类似于指针,因此它们的“按值”复制是将视图复制到容器中,而不是它们引用的数据。如果我string_view通过右值引用来获取样式视图,这并不意味着它拥有内容:从内容移动是不合理的,只是因为指针本身是右值而移动指针的内容。

同时,容器遵循值语义,并且因为它们是右值而移动它们的内容是有效的。

因为string_view这不是问题,但我编写了更通用的view类,例如contiguous_range_view,它可以让您对 avectorarrayor的子集进行操作,arr[]就好像它是一个大小不可变的缓冲区一样。

这些视图并不总是将其内容视为const,但它们并不拥有其内容。所以视图是右值并不意味着它们的内容是右值!

我的算法喜欢concatinate在这里遇到问题。视图与容器几乎没有区别,右值容器可以有效地被移出,而右值视图则不是。按值返回视图的函数是一种很好的模式,因为视图在语义上是指针类型。

我正在寻找一种很好、干净的方式来区分容器和视图。是否有计划string_view通过我现在可以模拟或挂钩的某些属性或标签在 C++1y 中进行区分?如果没有,有没有好的模式?

如果我设法阻止视图被意外移动,有时我仍然需要能够从它们移动,所以我需要一种方法来将视图标记为移动候选而不是右值引用. 我怀疑一个make_move_range函数可能会解决这个问题(它需要一个可迭代的范围,并适用std::make_move_iteratorbeginand end)。

0 投票
1 回答
5464 浏览

c++ - 透明的算子函子

Visual Studio 2013 Preview 支持称为(根据页面)“透明运算符函子”的 C++14 功能。我不清楚这意味着什么。我找到的最近的 C++14 提案是这个,但我不确定它是否是同一件事: http ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3421

我正在寻找关于它是什么、为什么它是改进的更清晰的解释,也许还有一个展示其用途的片段。

0 投票
1 回答
10128 浏览

c++ - 执行 constexpr 运算符重载的指南?

考虑一个简单的 intWrapper类,它具有重载的乘法operator*=operator*. 对于“旧式”运算符重载,可以根据 定义operator*operator*=甚至还有像Boost.Operators这样的库以及@DanielFrey的现代化身df.operators可以为您减少样板文件。

然而,对于使用新的 C++11 的编译时计算constexpr,这种便利就消失了。Aconstexpr operator*不能调用operator*=,因为后者修改了它的(隐式)左参数。此外,在 constexpr 上没有重载constexpr operator*,因此在现有结果中添加额外内容会operator*导致重载决议模糊。

我目前的做法是:

现场输出在这里。我的问题是:

  • 和 中的乘法逻辑的重复operator*=operator*而不是operator*表示为operator*=
  • 因此,Boost.Operators 不再用于减少编写许多其他算术运算符的样板文件

问题:这是推荐的具有运行时operator*=和混合运行时/编译时的 C++11 方式constexpr operator*吗?C++14 是否改变了这里的任何东西以减少逻辑重复?

更新:@AndyProwl 的答案被认为是惯用的,但根据@DyP 的建议,在 C++11 中,可以通过额外的赋值和反直觉的风格来减少逻辑重复

0 投票
1 回答
6902 浏览

c++ - C++1y 模式下的 Clang >= 3.3 无法解析标题

我有一个项目可以在 g++ 4.8.1 和 clang >= 3.3 下在 c++11 模式下正确编译和运行。但是,当我切换到实验-std=c++1y模式时,clang 3.3(但不是 g++)会阻塞<cstdio>通过 Boost.Test 间接包含的标题(所以我自己不能轻易更改它)

带有以下错误消息:

/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/cstdio:119:11:错误:全局中没有名为“gets”的成员命名空间

这个关于如何设置现代 C++ 环境的教程中,max_align_t遇到了类似的查找问题。那里的建议是使用 sed 脚本用#ifdef __clang__宏包围未知符号,但这似乎是一种脆弱的方法。

设置:普通的 64 位 Linux Mint 15

g++ (Ubuntu 4.8.1-2ubuntu1~13.04) 4.8.1

Ubuntu clang 版本 3.3-3~raring1 (branches/release_33) (基于 LLVM 3.3)

问题

  • 是什么导致了这个错误?有__clang__问题的代码附近没有宏,c++11模式下的clang一点问题都没有。
  • 这是一个语言问题(C++14 是否说 C++11 之外的其他内容,关于将 C 兼容符号从全局导入std命名空间)?
  • 我需要用我的包含路径改变一些东西吗?(我使用 CMake 自动选择标题路径,并在 CMakeLists.txt 中切换模式)
  • 铿锵有开关来解决这个问题吗?
0 投票
1 回答
425 浏览

c++ - 模板约束是否可用于变量模板?

在最新的模板约束论文中,提出了一个约束模板参数的新工具集。此外,在 C++14 中提供了变量模板。变量模板允许定义类型参数化常量等。

没有提及这些功能如何交互。使用 pi 的规范示例,我们可以得到:

这将强制 C/C++ 数字转换从整数到双精度。它还可以防止使用完全不相关的类型进行实例化。(看看这个,我们可能想用需要浮点 ctor 的东西来替换 Floating_point 以支持复数。)

我是否遗漏了其中一篇论文中的某些内容,还是正在研究中?也许它是免费的,不值得一提?

0 投票
2 回答
48937 浏览

c++ - 如何在 C++11 中实现 make_unique 函数?

我的编译器不支持 make_unique。一个怎么写?