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

c++ - 在 C++1z 中声明朋友模板类模板会产生错误:'template 的特化类 A' 必须出现在命名空间

我正在使用 boost asio 协程,我想使用新的文件系统 TS (-stdc++fs),所以我升级到 GCC 6-20151025 快照。它工作得很好。但是后来我打开了 -std=c++1z 并且在 boost 的源代码中出现了一个错误。我隔离了错误,这是一个最小的例子:

它使用 -std=c++14 编译良好,但为 -std=c++1z 生成以下错误:

我追踪了源中的错误,并且在 pt.c 中新引入的函数“maybe_new_partial_specialization”中的行为似乎有所不同。特别是在仅在概念 TS处于活动状态时才激活的情况。

在将其报告为错误之前,我想先检查这是否是 Concepts TS/C++1z 中的预期行为。

谢谢你。

编辑:根据下面的答案,事实证明这是一个错误,因此我在这里报告了它。

0 投票
1 回答
1901 浏览

c++ - std::invoke(C++1z) 是如何工作的?

我从这里看到了上面的实现:

http://en.cppreference.com/w/cpp/utility/functional/invoke

然后我想知道编译器如何匹配所需的确切版本。SFINAE 是否适用于尾随回报类型?

0 投票
1 回答
631 浏览

c++ - 为什么这个变量在 C++14 中的 g++ 中没有被推断为 initializer_list?

考虑以下程序:

-std=c++14即使我使用选项,它也可以在 ideone 上正常编译。在此处查看现场演示。但在 C++14 中,变量i应该initializer_list根据this推导出来。

有一个针对 C++1z 的提议,它为大括号初始化实现了新的类型推导规则:

对于直接列表初始化:

  1. 对于只有一个元素的花括号初始化列表,自动推导将从该条目中推导出;

  2. 对于具有多个元素的支撑初始化列表,自动推导将是不正确的。

[例子:

自动 x1 = { 1, 2 }; // decltype(x1) 是 std::initializer_list

自动 x2 = { 1, 2.0 }; // 错误:无法推断元素类型

自动 x3{ 1, 2 }; // 错误:不是单个元素

自动 x4 = { 3 }; // decltype(x4) 是 std::initializer_list

自动 x5{ 3 }; // decltype(x5) 是 int。

--结束示例]

因此,规则在 C++17 中发生了变化。因此,当我使用-std=c++14. 这是g ++中的错误吗?不应该像C++14 中i那样推导出变量吗?initializer_list

0 投票
1 回答
739 浏览

c++ - Why is a convenience helper for the erase-remove-idiom not provided by the standard?

Removing items from a collection in the STL requires a technique used so often that is has become an idiom: the erase-remove-idiom

One of the most common usages of this idiom is to remove an item of type T from a vector<T>

This is obviously very verbose, and violates the DRY principle - the vector in question is required 4 times there.

So my question is why does the standard not provide a convenience helper?

Something like

or

This could obviously be extended to

etc...

0 投票
0 回答
367 浏览

c++ - 有哪些 C++1z 公理的例子?

C++1z 应该在语言中引入概念(约束 + 公理)。除了已经提到的那些公理(自反性、交换性、传递性)之外,还有哪些其他公理可能有用?公理是否应该仅用于编译器优化,或者它们也可以用于不同的目的?

0 投票
1 回答
603 浏览

c++ - 如何使用带有 lambda 仿函数参数的 requires 子句?

有什么方法可以将一般要求子句应用于 lambda 仿函数的参数?

假设我有两个约束C1C2并且我想检查一个参数。我希望以下内容可以工作,因为函数允许使用类似的语法:

但这不会与 GCC 6 一起编译

0 投票
10 回答
49764 浏览

c++11 - 获取 Apple clang 版本和对应的上游 LLVM 版本

我想了解我的 macbook 中安装了哪个版本的 clang Apple,以查看可用的 c++11 和/或 c++14 功能。我输入了这个命令:

但我无法理解是什么(clang-700.1.76)意思。如何将此代码转换为 clang 版本?

这是您可以检查 clang 版本http://clang.llvm.org/cxx_status.html中可用的 c++ 功能的站点

0 投票
2 回答
851 浏览

c++ - SFINAE 和重载函数的地址

我正在尝试bar在另一个函数的参数 ( foo1/ foo2) 的上下文中解析重载函数 ( ) 的地址。

没有问题foo1,它明确指定bar' 类型。

但是,foo2通过 SFINAE 禁用除一个版本之外的所有版本的bar,无法编译并显示以下消息:

据我了解,C++ 不能同时解析重载函数的地址并执行模板参数推导。

是这个原因吗?有没有办法foo2<Baz>(bar);编译(或类似的东西)?

0 投票
2 回答
206 浏览

c++ - 以 :: 开头的 C++ 嵌套命名空间定义

在草案 §7.3.1¶1 (n4527) 中,命名空间定义的语法包含:

封闭命名空间说明符:

标识符

封闭命名空间说明符 :: 标识符

这可以防止命名空间定义具有以“::”开头的标识符

这种限制有什么理由吗?


更新: downvote(s) 和一些答案让我意识到当我在第一句话中的意思是“草稿”时,我写了“标准”。在我的辩护中,我确实在括号中写了文件编号。因此,让我强调这是一个关于 C++1z 的嵌套命名空间定义特性的问题。

0 投票
2 回答
1304 浏览

c++ - 这段代码怎么会是 constexpr?(标准::计时)

Howard Hinnant 在标准文件 P0092R1 中写道:

这段代码如何工作?问题是operator--on astd::chrono::duration不是 constexpr 操作。它被定义为:

然而这段代码可以编译,并在编译时给出正确的答案:

那是怎么回事?