问题标签 [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.

0 投票
2 回答
806 浏览

c++ - 为什么 std::optional::value() &&; 返回 &&?

当使用 std::optional 替换一些代码时,我遇到了运行时错误:

旧代码:

新代码:

这对我来说是不可预测的。崩溃的原因是方法返回T&&

我的问题是在什么情况下T&&有用,为什么该方法不返回T.

完整代码:

0 投票
1 回答
3736 浏览

c++ - clang6 是否实现 std::optional?

我想使用 C++17 std::optional,但在 clang 中似乎不存在:

如您所见,我使用的是相当新的 clang 版本,据我所知,clang 6 应该具有完整的 C++17 支持。乍一看,这似乎是一个问题,特别是因为包含<experimental/optional>工作正常,但也许是我错过了一些东西。你有什么想法?

谢谢

0 投票
2 回答
2025 浏览

c++ - nullptr、{} 和 nullopt 的区别

为什么我不能使用nullptr代替nullopt?为什么{}翻译成这样nullopt

0 投票
3 回答
7619 浏览

c++ - 使用 std::optional 来避免函数中的默认参数有什么好处吗?

我正在将代码移植到 C++17,尽可能地尝试使用新功能。我喜欢的一件事是std::optional在某些情况下可能会失败的函数中用于返回或不返回值的想法。

我很好奇这个新特性的可能用途,我正在考虑开始使用它来替换函数中的可选参数,所以:

变成:

根据官方文档:

如果一个可选项包含一个值,则该值保证作为可选对象占用空间的一部分进行分配,即不会发生动态内存分配。因此,即使定义了 operator*() 和 operator->(),可选对象也建模对象,而不是指针。

因此,每次我们使用 std::optional 来传递参数时,它都意味着创建副本,如果对象很大,则可能是一种惩罚性能。

我喜欢这个想法,因为它使代码更简单易懂,但是有什么优势吗?

0 投票
2 回答
950 浏览

c++ - clang 5:std::optional 实例化参数类型的 std::is_constructible 特征

当切换到 c++17 并用std::optional标准解决方案替换自定义解决方案时,检测到 clang 5 的一个非常奇怪和意外的行为。由于某种原因,由于对参数类特征的emplace()错误评估而被禁用。std::is_constructible

在复制之前必须满足一些特定的先决条件:


godbolt.org上的实时示例


更改任何先决条件并按预期编译。标准中是否存在一些未知的不一致,使 clang 在合规的同时拒绝此代码?

附带说明:GCC 7.1GCC 7.2对上述代码没有任何问题。


错误报告:bugs.llvm.org

0 投票
1 回答
112 浏览

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以某种方式仍然可以使用这种用法吗?
如果没有,阻止它的原因是什么?

0 投票
1 回答
2446 浏览

c++ - 为什么 std::optional 构造函数使用 std::in_place?

一些std::optional构造函数使用这样的std::in_place_t标记参数:

我看到这样的构造函数可以在没有就地标签的情况下实现,并使用一些enable_if(SFINAE)魔法来不参与不情愿的重载,即:

为什么std::optional's 的就地构造函数是用std::in_place_t标签而不是一些enable_if魔法(而且没有标签)实现的?

更新:问题略有更新,以强调我意识到简单地省略就地标签是行不通的。

0 投票
1 回答
465 浏览

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 boolnoexceptoperator*不是(即使它没有抛出,可能是因为如果在可选项不包含值时使用它仍然会因 UB 失败) noexcept但是,我们保证永远不会尝试返回包含的值,除非我们有一个。

所以不能value_or声明noexcept给定is_nothrow_copy_constructible<T> && noexcept(static_cast<T>(std::forward<U>(v)))

0 投票
4 回答
76 浏览

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?

0 投票
0 回答
38 浏览

c++ - 有什么方法可以移动在使用它的结构内返回 std::optional 的 constexpr 函数?

我知道问题的标题令人困惑,所以这里是示例:

这段代码编译得很好,但是当我maybe_int进入 struct 编译失败时。

错误:'static constexpr std::optional<int> s::maybe_int()' 在定义完成之前在常量表达式中调用

请注意,我知道代码可以与自由功能一起正常工作,这是关于可读性的。所以我想maybe_int在 struct 里面移动。