问题标签 [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 回答
295 浏览

c++ - clang 3.6折表达式左/右

我正在尝试使用 clang 3.6 '--std=c++1z' 的折叠表达式,但我不太明白。我正在测试的功能是:

根据n4191,我预计它会扩展为左折叠

这给出了结果 5,但是,结果是 9,这似乎是一个右折叠扩展,即

我是否遗漏了什么或误解了 n4191?谢谢

0 投票
2 回答
384 浏览

c++ - 当 f & g 修改同一个全局变量时,表达式 f() > g() 的值是未定义还是未指定?

更新:正如用户ecatmur所标记的,它是在 C99 中的副本,是 f()+g() 未定义还是未指定?(虽然问题是关于 C99 的,但 C++ 的答案是不变的)。答案是:未指定(对于这两种情况)。


考虑以下 C++14 代码片段:

z 仅仅是未指定的值,还是未定义的行为?

根据我的理解(如果我错了,请更正),这样的表达式:i++ > i++将是未定义的行为,因为我们在一对序列点之间对相同的变量进行两次变异,但是上面的情况呢(变异发生在单独的职能) ?

那这个呢:

0 投票
32 回答
268415 浏览

c++ - 在现代 C++11/C++14/C++17 和未来的 C++20 中枚举到字符串

与所有其他类似问题相反,这个问题是关于使用新的 C++ 功能。

在阅读了许多答案后,我还没有找到任何答案:

例子

一个例子通常比一个冗长的解释更好。您可以在Coliru
上编译和运行此代码段。也可以使用另一个以前的示例)

约束

  • 请不要无价值地重复其他答案基本链接
  • 请避免臃肿的基于宏的答案,或尽量减少#define开销。
  • 请不要使用手册enum->string映射。

很高兴有

  • 支持enum从不为零的数字开始的值
  • 支持enum负值
  • 支持碎片化enum
  • 支持class enum(C++11)
  • 支持class enum : <type>任何允许的<type>(C++11)
  • 编译时(不是运行时)转换为字符串,
    或者至少在运行时快速执行(例如std::map,这不是一个好主意......)
  • constexpr(C++11,然后在 C++14/17/20 中放宽)
  • noexcept(C++11)
  • C++17 / C++20友好代码片段

一种可能的想法是使用 C++ 编译器功能在编译时使用基于variadic template classconstexpr函数的元编程技巧生成 C++ 代码......

0 投票
4 回答
394 浏览

c++ - 编写现代函数接口以“生成填充容器”

当我开始学习 C++03 时,我学会了几种编写“给我东西集合”函数的方法。但每个都有一些挫折。

或者:

  • 这与容器无关
  • 该接口不会传达预期的空容器。

或者:

  • 这与容器无关
  • 有几种不必要的复制途径。(错误的容器类型,错误的包含类型,没有 RVO,没有移动语义)

使用现代 C++ 标准,是否有更惯用的函数接口来“生成填充容器”?

0 投票
3 回答
3289 浏览

c++ - C++14 为 is_same::value 使用别名

本题使用is_same<uint64_t, decltype(val)>::value.

我预计会有一个 C++14 using alias:is_same_v类似于 helper types: conditional_t, enable_if_t, 并且tuple_element_t我在我的答案中使用它。因为我使用这些功能的唯一目的就是获取type. 所以这个*_t助手是有道理的。

这让我想到了我的问题,为什么using alias is_same_vC++14 中没有?我唯一使用is_same的是它value。也许is_same不是通常用于模板声明?

0 投票
3 回答
380 浏览

c++ - 精简版概念将如何与通用参考进行交互?

我最近看了这个视频,解释了 C++ 中精简概念的想法,今年可能会以 TS 的形式出现。现在,我还了解了通用引用/转发引用(如此所述),并且 T&& 可以根据上下文有两种含义(即是否正在执行类型推导)。这自然会引出一个问题,概念将如何与通用引用相互作用?

具体来说,在下面的例子中,我们有

但是如果我们使用概念会发生什么?

尤其是最后一个例子让我有点困扰,因为有两个相互冲突的原则。首先,以这种方式使用的概念应该像类型一样工作,其次,如果 T 是推导类型,则 T&& 表示通用引用而不是右值引用。

提前感谢您对此的澄清!

0 投票
1 回答
529 浏览

c++ - std::optional::value_or_default 和 std::optional::is_engaged

我已经使用实验std::optional一段时间了,我想知道是否std::optional<T>::value_or_default 曾经考虑过类似的方法。如果参与,这将为您提供价值,如果不参与,则为您提供默认值T。是的,它很容易写std::optional::value_or( T { } ),但有时如果T有一堆字符,我认为它不像写那么清楚value_or_default

此外,像 n3672 这样的论文并没有给出一个很好的理由来说明为什么std:optional::is_engaged不包括这样的方法。我理解为什么nullopt在某些情况下有用并被包括在内,但我认为std::optional::is_engaged简单的 if 表达式更清楚。

0 投票
2 回答
747 浏览

c++ - 通过从函数返回值移动的大括号初始化给出“多余元素”错误

给定以下代码片段:

我希望单行main声明和定义/初始化myFoo使用Foo的移动构造函数的返回值makeFoo()

clang++但是,我从3.5.1(以 C++14 模式编译)收到以下错误:

这里发生了什么?“结构初始化程序”到底是什么意思——它只是 POD 的默认(无参数)构造函数吗?为什么不调用移动构造函数?

0 投票
3 回答
2656 浏览

c++ - 在模板功能和自动类型扣除之间进行选择

我有一个关于模板函数与函数的自动类型推导的一般性问题。

多年来,我们已经能够编写模板函数:

函数的参数推导有一个使用auto的TS

我虽然使用自动,但无法获取实际类型,例如使用静态成员,但这很好用:

那么有什么理由选择一个而不是另一个?

0 投票
0 回答
320 浏览

c++ - 到目前为止,是什么阻止了 C++ ABI 的出现?

所以,我知道用于 C++ 的 ABI 可以实现很多好东西(例如,预先构建的库获取和返回智能指针,而不必担心崩溃和烧毁。)

现在,我意识到 ABI 是一件非常重要的事情,但是 - 经过 30 年的 C++ 和 25 年的 32 位 x86 上的 C++ 之后,为什么甚至没有 x86 的事实上的 ABI 标准(和 x86_64)平台?

编辑:更具体地说,我将把问题限制在技术上,而不是社会和政治上,阻碍采用或多或少统一的 ABI 的障碍。