问题标签 [stdoptional]
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++ - 为什么 std::optional::value() &&; 返回 &&?
当使用 std::optional 替换一些代码时,我遇到了运行时错误:
旧代码:
新代码:
这对我来说是不可预测的。崩溃的原因是方法返回T&&
。
我的问题是在什么情况下T&&
有用,为什么该方法不返回T
.
完整代码:
c++ - clang6 是否实现 std::optional?
我想使用 C++17 std::optional
,但在 clang 中似乎不存在:
如您所见,我使用的是相当新的 clang 版本,据我所知,clang 6 应该具有完整的 C++17 支持。乍一看,这似乎是一个问题,特别是因为包含<experimental/optional>
工作正常,但也许是我错过了一些东西。你有什么想法?
谢谢
c++ - nullptr、{} 和 nullopt 的区别
为什么我不能使用nullptr
代替nullopt
?为什么{}
翻译成这样nullopt
?
c++ - 使用 std::optional 来避免函数中的默认参数有什么好处吗?
我正在将代码移植到 C++17,尽可能地尝试使用新功能。我喜欢的一件事是std::optional
在某些情况下可能会失败的函数中用于返回或不返回值的想法。
我很好奇这个新特性的可能用途,我正在考虑开始使用它来替换函数中的可选参数,所以:
变成:
根据官方文档:
如果一个可选项包含一个值,则该值保证作为可选对象占用空间的一部分进行分配,即不会发生动态内存分配。因此,即使定义了 operator*() 和 operator->(),可选对象也建模对象,而不是指针。
因此,每次我们使用 std::optional 来传递参数时,它都意味着创建副本,如果对象很大,则可能是一种惩罚性能。
我喜欢这个想法,因为它使代码更简单易懂,但是有什么优势吗?
c++ - clang 5:std::optional 实例化参数类型的 std::is_constructible 特征
当切换到 c++17 并用std::optional
标准解决方案替换自定义解决方案时,检测到 clang 5 的一个非常奇怪和意外的行为。由于某种原因,由于对参数类特征的emplace()
错误评估而被禁用。std::is_constructible
在复制之前必须满足一些特定的先决条件:
godbolt.org上的实时示例
更改任何先决条件并按预期编译。标准中是否存在一些未知的不一致,使 clang 在合规的同时拒绝此代码?
附带说明:GCC 7.1和GCC 7.2对上述代码没有任何问题。
错误报告:bugs.llvm.org
c++ - 引用一个空的可选值
我已经多次看到以下模式:
这与适当的命名空间和命名相结合,为t
变量的用户提供了一个new
令人愉快的接口(你可以看到它在这里工作。
现在,std::aligned_storage
很简洁,但是 C++17 为我们提供了一个用于存储与对象生命周期分割的新工具,即std::optional
.
但是,访问std::optional
(value()
和operator*
) 值的两种方法都需要一个值才能实际存在。否则value()
将 throw std::bad_optional_access
,而operator*
将触发未定义的行为(根据[optional.observe]§5中的requires子句)。
std::optional
以某种方式仍然可以使用这种用法吗?
如果没有,阻止它的原因是什么?
c++ - 为什么 std::optional 构造函数使用 std::in_place?
一些std::optional
构造函数使用这样的std::in_place_t
标记参数:
我看到这样的构造函数可以在没有就地标签的情况下实现,并使用一些enable_if
(SFINAE)魔法来不参与不情愿的重载,即:
为什么std::optional
's 的就地构造函数是用std::in_place_t
标签而不是一些enable_if
魔法(而且没有标签)实现的?
更新:问题略有更新,以强调我意识到简单地省略就地标签是行不通的。
c++ - 有什么东西可以阻止 std::optional::value_or() 有条件地为 noexcept 吗?
以下是value_or()
C++17 标准的定义:
template <class U> constexpr T value_or(U&& v) const&;
效果:相当于:
return bool(*this) ? **this : static_cast<T>(std::forward<U>(v));
备注:如果
is_copy_constructible_v<T> && is_convertible_v<U&&, T>
是false
,则程序格式错误。
(右值重载类似)
的效果value_or
被描述为等同于return bool(*this) ? **this : static_cast<T>(std::forward<U>(v));
operator bool
是noexcept
。operator*
不是(即使它没有抛出,可能是因为如果在可选项不包含值时使用它仍然会因 UB 失败)。 noexcept
但是,我们保证永远不会尝试返回包含的值,除非我们有一个。
所以不能value_or
声明noexcept
给定is_nothrow_copy_constructible<T> && noexcept(static_cast<T>(std::forward<U>(v)))
?
c++ - 与返回类型无关的 value_or 的替代方案
我建立了一个Card
重载<<
运算符的小类,基本上打印出卡片的花色和价值。
实现细节与我想在这里提出的问题无关,只是假设显而易见。因为Card
我建了一个类CardDeck
。当然CardDeck
可以用完卡。这促使我进行了这次尝试:
现在可以抽一张牌,处理空牌的可能性是客户端代码使用的责任CardDeck
,但该方法并不总是返回值是冗长的。我喜欢那个解决方案。
无论如何,我是 C++ 的新手,我做了一个天真的 ansatz:
std::cout<< cardDeck.drawCard().value_or("Out of cards!");
这会失败,因为"Out of cards!"
ischar*
但 not的类型Card
。
我的问题:有没有办法在不检查和访问 vaule/在两个单独的地方使用替换的情况下保护优雅的 oneliner?
c++ - 有什么方法可以移动在使用它的结构内返回 std::optional 的 constexpr 函数?
我知道问题的标题令人困惑,所以这里是示例:
这段代码编译得很好,但是当我maybe_int
进入 struct 编译失败时。
错误:'static constexpr std::optional<int> s::maybe_int()' 在定义完成之前在常量表达式中调用
请注意,我知道代码可以与自由功能一起正常工作,这是关于可读性的。所以我想maybe_int
在 struct 里面移动。