问题标签 [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.
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 相比是否已修复此问题?
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?
c++ - auto 对编译时间的影响
我们在 C++11 中获得的新 auto 关键字对我来说看起来很模板化,所以我的问题是 - 它会导致与模板相同的编译时间膨胀吗?
关于多态 lambda 的相同问题:
这本质上是一个模板 lambda - 这会影响编译时间吗?
c++ - SFINAE 和 decltype(自动)
如果一个函数模板返回decltype(auto)
(或另一个使用 的类型说明符auto
)但返回语句格式不正确,SFINAE 会导致结果吗?该return
语句是否被认为是函数签名的直接上下文?
N3690 草案中似乎没有任何要求。默认情况下,我猜 SFINAE 不适用。
这似乎很不幸,因为您可以编写一个函数来转发到另一个函数,但是您不能像以手写方式编写时那样使其存在以委托为条件。此外,无法检查对等非静态成员函数的存在,decltype(auto)
因为this
不能在函数签名中使用。然而,这表明了一个基本问题,因为decltype(auto)
它提供了一条路径,可以在成员签名中将类类型视为完整,而事实并非如此。
有没有写过提案,或者有没有在任何地方正式分析过问题?
在成员签名中将类类型视为完整的能力可能具有其他含义……但这只是另一个问题的素材。
c++ - 区分右值视图和右值容器
我正在编写一些基于容器或可迭代的算法。for( : )
基本上,我对支持样式迭代的对象进行操作(我很少for( : )
直接使用,但遵循它如何查找begin
和end
迭代器)。
在std
库中,大多数可迭代对象都是容器。他们都拥有自己的数据,并让您查看。
当算法通过右值引用获取容器时,这意味着容器的内容也可以自由获取。例如,如果我写concatinate
了两个vector
s 并返回第三个,如果两个vector
s 都是move
d,我们将希望重用第一个,vector
然后使用move_iterator
s 从第二个中取出数据vector
以提高效率。
但是,对于概念上相似的 C++1ystring_view
和类型,我们拥有不是容器的可迭代对象,而是容器中的视图。从语义上讲,我相信视图的行为类似于指针,因此它们的“按值”复制是将视图复制到容器中,而不是它们引用的数据。如果我string_view
通过右值引用来获取样式视图,这并不意味着它拥有内容:从内容移动是不合理的,只是因为指针本身是右值而移动指针的内容。
同时,容器遵循值语义,并且因为它们是右值而移动它们的内容是有效的。
因为string_view
这不是问题,但我编写了更通用的view
类,例如contiguous_range_view
,它可以让您对 avector
或array
or的子集进行操作,arr[]
就好像它是一个大小不可变的缓冲区一样。
这些视图并不总是将其内容视为const
,但它们并不拥有其内容。所以视图是右值并不意味着它们的内容是右值!
我的算法喜欢concatinate
在这里遇到问题。视图与容器几乎没有区别,右值容器可以有效地被移出,而右值视图则不是。按值返回视图的函数是一种很好的模式,因为视图在语义上是指针类型。
我正在寻找一种很好、干净的方式来区分容器和视图。是否有计划string_view
通过我现在可以模拟或挂钩的某些属性或标签在 C++1y 中进行区分?如果没有,有没有好的模式?
如果我设法阻止视图被意外移动,有时我仍然需要能够从它们移动,所以我需要一种方法来将视图标记为移动候选而不是右值引用. 我怀疑一个make_move_range
函数可能会解决这个问题(它需要一个可迭代的范围,并适用std::make_move_iterator
于begin
and end
)。
c++ - 透明的算子函子
Visual Studio 2013 Preview 支持称为(根据此页面)“透明运算符函子”的 C++14 功能。我不清楚这意味着什么。我找到的最近的 C++14 提案是这个,但我不确定它是否是同一件事: http ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3421
我正在寻找关于它是什么、为什么它是改进的更清晰的解释,也许还有一个展示其用途的片段。
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 中,可以通过额外的赋值和反直觉的风格来减少逻辑重复
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 中切换模式)
- 铿锵有开关来解决这个问题吗?
c++ - 模板约束是否可用于变量模板?
在最新的模板约束论文中,提出了一个约束模板参数的新工具集。此外,在 C++14 中提供了变量模板。变量模板允许定义类型参数化常量等。
没有提及这些功能如何交互。使用 pi 的规范示例,我们可以得到:
这将强制 C/C++ 数字转换从整数到双精度。它还可以防止使用完全不相关的类型进行实例化。(看看这个,我们可能想用需要浮点 ctor 的东西来替换 Floating_point 以支持复数。)
我是否遗漏了其中一篇论文中的某些内容,还是正在研究中?也许它是免费的,不值得一提?
c++ - 如何在 C++11 中实现 make_unique 函数?
我的编译器不支持 make_unique。一个怎么写?