是否使用空的 std::可选<string> UB?

Is use of empty std::optional<string> UB or not?

本文关键字:lt gt UB string 可选 std 是否      更新时间:2024-09-22

以下代码:

std::optional<std::string> so;
std::cout << so->size() << std::endl;
std::cout << so.has_value();

输出:

0
0  

我的问题是在空的可选项上调用:so->size()是否安全。我使用了clang消毒液,但在上面的代码中没有报告任何UB。

在空的std::optional上使用operator->是未定义的行为,无论std::optional<T>中的T是什么类型。

根据std::optional<T>::operator->:上的cppreference

如果*this不包含值,则行为未定义。

引用当前C++工作草案

20.6.3.6观察员[可选。观察]

constexpr const T* operator->() const;
constexpr T* operator->();

前提条件:*this包含一个值。


然后:

16.3.2.4详细规范【结构规范】

前提条件:函数假定保持的条件无论何时调用;违反任何先决条件导致未定义的行为。

因此,它是未定义的行为。

您正在调用默认的optional构造函数(该链接中的1(,它。。。

  1. 构造一个不包含值的对象

当您转到取消引用时。。。

如果*this不包含值,则行为未定义。

在您的情况下,它不是。是的,你有UB。