问题标签 [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++ - 函数中的自动参数类型
我想知道标准委员会是否考虑扩展 C++14auto
关键字来推断函数模板参数类型,因为它现在存在于通用 lambda 中。(从这个答案中可以很好地看出)
因为它适用于 lambda 函数,所以它也应该适用于任何函数。当然,经典语法完全是多余的:
但是为了同样的结果,能够写这个:
我认为可以减少堵塞的代码(更短更整洁),并在这个用例中保持高度的一致性:
如您所见,我们使用自动类型推断器来声明v
,但随后我们必须使用硬类型参数化函数 f 或模板化 f。
结合auto
我们应该使用auto
,那会更一致。
编辑:这个问题确实有效地提出了同样的问题,但不那么直接。并且还没有得到 user657267 给出的答案,我在其下复制和扩展。
c++ - 为什么原始字符串文字的分隔符必须小于 16 个字符?
以下程序无法编译:
错误: raw string delimiter longer than 16 characters
。
为什么对原始字符串定界符施加长度限制?
c++ - 使用observer_ptr
std::observer_ptr
库基础技术规范 V2中的构造到底有什么意义?
在我看来,它所做的只是包装一个 bare T*
,如果它没有增加动态内存安全性,这似乎是一个多余的步骤。
在我的所有代码std::unique_ptr
中,我都使用了需要明确拥有对象以及std::shared_ptr
可以共享对象所有权的位置。
这非常有效,可以防止意外取消引用已销毁的对象。
std::observer_ptr
当然,不保证观察到的对象的生命周期。
如果它是由 a 构造的,std::unique_ptr
或者std::shared_ptr
我会在这样的结构中看到一个用途,但是任何简单使用的代码T*
都可能会继续这样做,并且如果他们计划移动到任何它会std::shared_ptr
和/或std::unique_ptr
(取决于使用时)。
给定一个简单的示例函数:
如果它阻止智能指针在被观察时破坏其存储的对象,这将是有用的。
但是如果我想观察 astd::shared_ptr
或者std::unique_ptr
我必须写:
这使得它不比以下更安全:
那么,这种新结构有什么用呢?
它只是用于自我记录的来源吗?
c++ - 范围保护的语言支持
范围保护是非常C++方式的惯用语。它很好地与异常交互并符合 RAII。C++没有对范围保护的本机支持。我的意思是干净的语法。目前我只能编写一个辅助类:c-tor 将 lambda 存储为数据成员和 d-tor 调用 lambda(在范围退出或抛出异常时)。
目前是否有任何关于C++中范围保护的便捷语法的建议?
我的意思是int * i = new int; ~[&i] { if (i) { delete i; i = nullptr; } }; ...
甚至(默认情况下捕获作为参考~{ /* statments */; }
) 。当 lambda-syntax 只是 with 的语法糖struct
时operator ()
,anonymous 的“inline”-destructor 可能存在 lambda-similar-syntax struct
。
c++ - 为 C++17 提议的 UTF-8 字符文字有什么意义?
N4267提出的这些究竟有什么意义?
它们的唯一功能似乎是防止指定扩展的 ASCII 字符或部分 UTF-8 代码点。它们仍然存储在固定宽度的 8 位字符中(据我了解,对于几乎所有用例来说,这是处理 UTF-8 的正确和最佳方式),因此它们不支持非 ASCII 字符全部。到底是怎么回事?
(实际上我也不完全确定我是否理解对 UTF-8 字符串文字的需求。我猜这是编译器担心使用 Unicode 字符串加上 Unicode 验证做奇怪/模棱两可的事情?)
c++ - Clang 和二进制折叠表达式——空参数包的诅咒
特别是 Clang 3.6.0,目前由 Coliru 托管。
所有这些片段都是从以下位置调用的:
以下代码:
触发以下编译错误:
所以我尝试在表达式周围加上括号:
它有效,但会触发警告:
因此,我尝试使用函数样式强制转换来丢弃表达式的值void
:
但 :
我也尝试了static_cast
,结果相同。
所以我尝试使用 C-cast 代替:
但是之后 :
...而我的输出只是----
:foo(1, 2, 3);
不再输出了!
从未来的标准来看,Clang 是被邪恶力量诅咒了,它有错误吗,还是问题现在就在我的椅子上?
c++ - 使用 `void_t` 检测多继承类型重复错误
我想实现一个has_no_duplicates<...>
类型特征来评估std::true_type
传递的可变参数类型列表是否没有重复类型。
让我们假设,对于这个问题的范围,我想使用多重继承来做到这一点。
当一个类多次继承同一个类型时,就会发生错误。
我以为我可以用来void_t
“检测”这个错误,但是我无法按照 cppreference 中的代码示例实现有效的解决方案。
这是我尝试过的:
对于我的第三次尝试,我尝试延迟使用作为模板模板参数dup_helper<...>
的包装类的扩展,例如并在.dup_helper
wrapper<dup_helper, ...>
void_t
不幸的是,我所有的尝试都导致上述错误总是阻止编译。
我认为这种类型的错误不能检测为“替换失败”,但我想确认一下。
这种错误实际上是无法检测到的void_t
吗?(会不会总是导致编译失败?)
有没有办法在不导致编译失败的情况下检测它?void_t
(或者仍然使用“多重继承技巧”的非解决方法)?
c++ - C++ 等价于 Rust 的 Result类型?
我喜欢在我的 C++ 代码中使用 std::experimental::optional,但问题是 value_or 要求默认值与可选值的类型相同。
当我想要一个包含 int 或包含错误消息的可选项时,这不能很好地工作。
Result<T, E>
我想我可以使用一个带有布尔值的联合结构来指示该值是否存在或者它是一个错误,但如果 C++ 只是具有像 Rust 这样的类型肯定会很好。
有没有这样的类型?为什么Boost没有实现它?
Result 确实比 Option 有用得多,而且 Boost 的人肯定知道它的存在。也许我会去阅读 Rust 实现,然后将其复制到 C++?
前任:
c++ - Concepts TS 中是否有任何预定义的概念?
'Concepts lite' 已经被接受为 TS 并且(示例实现)合并到 GCC 主分支中,所以后续问题是任何概念都会预定义(如Sortable
或Random_access_range
)吗?
我在哪里可以找到这些预定义的概念?
cppreference.com 上的列表是否准确而详尽?
我可以将它们与最新的 GCC 主干构建一起使用吗?
编辑 1:由于 C++17 不接受概念,将 C++17 更改为 TS。