问题标签 [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.
c++ - clang 3.6折表达式左/右
我正在尝试使用 clang 3.6 '--std=c++1z' 的折叠表达式,但我不太明白。我正在测试的功能是:
根据n4191,我预计它会扩展为左折叠
这给出了结果 5,但是,结果是 9,这似乎是一个右折叠扩展,即
我是否遗漏了什么或误解了 n4191?谢谢
c++ - 当 f & g 修改同一个全局变量时,表达式 f() > g() 的值是未定义还是未指定?
更新:正如用户ecatmur所标记的,它是在 C99 中的副本,是 f()+g() 未定义还是未指定?(虽然问题是关于 C99 的,但 C++ 的答案是不变的)。答案是:未指定(对于这两种情况)。
考虑以下 C++14 代码片段:
z
仅仅是未指定的值,还是未定义的行为?
根据我的理解(如果我错了,请更正),这样的表达式:i++ > i++
将是未定义的行为,因为我们在一对序列点之间对相同的变量进行两次变异,但是上面的情况呢(变异发生在单独的职能) ?
那这个呢:
c++ - 在现代 C++11/C++14/C++17 和未来的 C++20 中枚举到字符串
与所有其他类似问题相反,这个问题是关于使用新的 C++ 功能。
- 2008 c 有没有一种简单的方法可以将 C++ 枚举转换为字符串?
- 2008 c 在 C 中使用枚举类型的变量作为字符串的简单方法?
- 2008 c++ 如何轻松地将 c++ 枚举映射到字符串
- 2008 c++ 制作一个 C 标识符和一个字符串?
- 2008 c++ 是否有一个简单的脚本可以将 C++ 枚举转换为字符串?
- 2009 c++ 如何在 C++ 中使用枚举作为标志?
- 2011 c++ 如何将枚举类型变量转换为字符串?
- 2011 c++ 枚举到字符串 C++
- 2011 c++ 如何将枚举类型变量转换为字符串?
- 2012 c 如何在 c 中将枚举名称转换为字符串
- 2013 c 在 C 中对条件编译的枚举进行字符串化
在阅读了许多答案后,我还没有找到任何答案:
- 使用C++11、C++14或C++17新特性的优雅方式
- 或者在Boost中可以使用的东西
- 为C++20计划的其他内容
例子
一个例子通常比一个冗长的解释更好。您可以在Coliru
上编译和运行此代码段。(也可以使用另一个以前的示例)
约束
很高兴有
- 支持
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 class
和constexpr
函数的元编程技巧生成 C++ 代码......
c++ - 编写现代函数接口以“生成填充容器”
当我开始学习 C++03 时,我学会了几种编写“给我东西集合”函数的方法。但每个都有一些挫折。
- 这必须在头文件中实现
- 该接口不会传达预期的空容器。
或者:
- 这与容器无关
- 该接口不会传达预期的空容器。
或者:
- 这与容器无关
- 有几种不必要的复制途径。(错误的容器类型,错误的包含类型,没有 RVO,没有移动语义)
使用现代 C++ 标准,是否有更惯用的函数接口来“生成填充容器”?
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 表达式更清楚。
c++ - 通过从函数返回值移动的大括号初始化给出“多余元素”错误
给定以下代码片段:
我希望单行main
声明和定义/初始化myFoo
使用Foo
的移动构造函数的返回值makeFoo()
。
clang++
但是,我从3.5.1(以 C++14 模式编译)收到以下错误:
这里发生了什么?“结构初始化程序”到底是什么意思——它只是 POD 的默认(无参数)构造函数吗?为什么不调用移动构造函数?
c++ - 在模板功能和自动类型扣除之间进行选择
我有一个关于模板函数与函数的自动类型推导的一般性问题。
多年来,我们已经能够编写模板函数:
函数的参数推导有一个使用auto的TS
我虽然使用自动,但无法获取实际类型,例如使用静态成员,但这很好用:
那么有什么理由选择一个而不是另一个?
c++ - 到目前为止,是什么阻止了 C++ ABI 的出现?
所以,我知道用于 C++ 的 ABI 可以实现很多好东西(例如,预先构建的库获取和返回智能指针,而不必担心崩溃和烧毁。)
现在,我意识到 ABI 是一件非常重要的事情,但是 - 经过 30 年的 C++ 和 25 年的 32 位 x86 上的 C++ 之后,为什么甚至没有 x86 的事实上的 ABI 标准(和 x86_64)平台?
编辑:更具体地说,我将把问题限制在技术上,而不是社会和政治上,阻碍采用或多或少统一的 ABI 的障碍。