问题标签 [c++17]

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 投票
2 回答
677 浏览

templates - 将 lambda 作为模板参数传递给函数指针函数模板化

看起来我不能将无捕获 lambda 作为模板参数传递给由函数指针函数模板化的函数。我做错了,还是不可能?

0 投票
2 回答
1348 浏览

c++ - 前向声明类型上的 std::vector

以下代码似乎在 Clang++ 和 GCC 上正常工作:

当数据成员std::vector<A>被声明时,A仍然是一个不完整的类型。使用时相同,std::vector<B>并且B仅使用class B;. 它应该可以使用,std::vector因为它只包含一个指向 - 的指针A

这是保证工作,还是未定义的行为?

0 投票
5 回答
1818 浏览

c++ - 用于复制 cv 引用限定符的类型特征

在C++中编写类库代码我发现copy_cv_reference_t类型特征特别需要:

我使用两种方法为自己发明了它:通过类型限定符的 id 和仅通过 SFINAE。

第一种方法看起来有点人为,但提供了一个“类型限定符 id”作为附加方面,后者在某些情况下可能很有用。第二种方法本质上是两步法。它可能有缺点。此外,它还涉及std::remove_reference_t显示 cv 限定类型。

一方面,我知道标准允许实现具有“内在”类型的特征。另一方面,当前C++标准中没有类型特征。

copy_cv_reference_t类型特征的最佳实现是什么?不仅在以上两者之间。有没有更好的方法来实现它?有没有相应的提议?

取名呢?id的顺序呢?

0 投票
1 回答
687 浏览

c++ - 使用折叠表达式为数组实现运算符less

我正在使用最新的 clang++ 在 c++17 中使用折叠表达式。我尝试使用我想用于固定大小字符串的数组来实现 less 运算符。

这就是我要去的地方。有没有更好的方法来做到这一点,尤其是避免在表达式中分配索引?

使用“clang++ test_fold_expr_less.cpp -o test_fold_expr_less -std=c++1z”编译它,输出在这里。

0 投票
3 回答
20741 浏览

c++ - 什么是合约(为 C++17 提议的)?

我在 B. Stroustrup 的关于 C++17 的思考中阅读了有关合同的内容,并协助了一个小型演示文稿谈论它们,但我不确定我是否真的理解它们。

所以我有一些询问,如果可以用一些例子来说明它们:

  • 合约只是经典的更好的替代品,assert()它们应该一起使用吗?对于软件开发人员来说,哪些合同真的很简单?

  • 合同会对我们处理异常的方式产生影响吗?如果是,我们应该如何使用例外和合同?

  • 使用合约是否意味着执行时的开销?我们是否可以在发布代码上停用它们?

提案 N4415

Vector 类的索引操作符的前置条件契约可以写成:
T& operator[](size_t i) [[expects: i < size()]];

类似地,ArrayView 类的构造函数上的后置条件契约可以表示为: ArrayView(const vector<T>& v) [[ensures: data() == v.data()]];

感谢@Keith Thompson 评论:

合同没有进入 C++20一个新的研究组 SG21 已经成立。

0 投票
2 回答
10583 浏览

c++ - 为什么 boost::filesystem::canonical() 需要目标路径存在?

状态的文档boost::filesystem::canonical(const path& p)

概述:将必须存在的 p 转换为没有符号链接、点或点-点元素的绝对路径。
...
备注: !exists(p) 是一个错误。

这样做的结果是,如果 p 标识其目标不存在的符号链接,则该函数将失败file not found并且不返回路径。

这对我来说似乎过于严格:仅仅因为链接的目标不存在,我看不出函数无法解析该不存在目标的路径的原因。(相比之下,absolute()没有这样的限制。)

(显然,如果路径中的符号链接损坏,则无法解析目标路径。)

那么,这种限制有正当理由吗?

即使有,是否也有理由创建一个没有此限制的函数的变体?canonical()(如果没有这样的变体,获取路径需要手动复制 99% 的已经完成的操作,这很容易出错。)

我很欣赏这种情况之间存在stat()lstat()同样适用于这种情况的语义微妙之处——这正是我认为函数的变体同样合理的原因。

注意:这个问题同样std::experimental::filesystem适用基于boost::filesystem.

编辑:

在@Jonathan Wakeley 下面的知识渊博的回答之后,我仍然保留了我最初问题的本质,我将稍微重新构建:

  • 是否存在要求目标存在的潜在技术或逻辑原因boost::filesystem::canonical()我的意思是,目标的不存在是否以某种方式使解决规范形式的路径变得不可能?

  • 如果没有,是否有任何技术或逻辑理由提出仅与现有形式不同的功能变体,因为它不需要目标存在?

  • 在转换为boost::filesystem提议的 N4100的过程中(据我了解是这种情况) std::experimental::filesystem,是否在经过适当考虑后采用了这种限制canonical(),还是只是从 Boost 定义中“落空”?

编辑2:

我注意到 Boost 1.60 现在提供了以下功能weakly_canonical():“返回 p 并解析符号链接并规范化结果。返回:在canonical()由 p 的前导元素组成的路径上调用函数的结果组成的路径,如果存在的话,跟随p 中不存在的元素,如果有的话。”

编辑 3:

更多关于这个的讨论std::filesystem

0 投票
5 回答
14997 浏览

c++ - 如何在 C++ 中模拟解构?

在 JavaScript ES6 中,有一种称为解构的语言特性。它也存在于许多其他语言中。

在 JavaScript ES6 中,它看起来像这样:

我可以在 C++ 中做什么来获得类似的语法并模拟这种功能?

0 投票
3 回答
5432 浏览

visual-studio-2013 - 不在 MS Visual Studio 2013 中 - 怎么办?

我想使用std::experimental::optional,但 MSVS 2013 告诉我它找不到标题。

  • 为什么不在那里?
  • 我可以根据其他地方的代码推出自己的代码吗?C ++ 14提案可能吗?
0 投票
3 回答
1870 浏览

c++ - int a=1, 是一个 || 1 常量表达式?

N4527 5.20[expr.const]p5

一个常量表达式要么是一个左值核心常量表达式,其值是指一个实体,该实体是一个常量表达式(如下定义)的允许结果,要么是一个纯右值核心常量表达式,其值是一个对象,对于该对象及其子对象:

— 每个引用类型的非静态数据成员都引用一个实体,该实体是一个常量表达式的允许结果,并且

— 如果对象或子对象是指针类型,则它包含具有静态存储持续时间的对象的地址、此类对象末尾的地址 (5.7)、函数的地址或空指针值。

如果实体是具有静态存储持续时间的对象,该对象不是临时对象或者是其值满足上述约束的临时对象,或者它是一个函数,则该实体是常量表达式的允许结果。

a || 1常量表达式吗?


N4527 5.20[expr.const]p2

条件表达式 e 是核心常量表达式,除非按照抽象机 (1.9) 的规则对 e 的求值将求值以下表达式之一:

(2.7) — 左值到右值的转换 (4.1),除非它应用于

(2.7.1) — 一个整数或枚举类型的非易失性左值,它指的是一个完整的非易失性 const 对象,该对象具有前面的初始化,用常量表达式初始化,或

(2.7.2) — 引用字符串字面量 (2.13.5) 的子对象的非易失性泛左值,或

(2.7.3) — 一个非易失性泛左值,它指代一个用 constexpr 定义的非易失性对象,或者指代这种对象的一个​​非可变子对象,或

(2.7.4) — 文字类型的非易失性左值,指的是一个非易失性对象,其生命周期开始于对 e 的评估;

a || 1核心常量表达式吗?

0 投票
2 回答
447 浏览

c++ - What happens to Boost libs after their inclusion in C++, other than usage with older-standard code?

I've noticed how in C++11, C++14 and onward, more and more Boost libraries are adopted/incorporated into the actual language standard (or into TS documents, which are likely to end up as part of the standard): Boost.optional, Boost.Any, Boost's threading library, smart pointers, etc. etc.

Are these libraries now maintained solely for usage with C++ code using an older version of the language standard, or do they have additional use? Specifically, are some of them considered alternative semantic variants to the choices of the C++ standards bodies?