2

我需要在我的函数中使用默认值创建一个可选参数。目前签名看起来像这样:

void func(int a, std::optional<int> b = 10)

该函数的行为方式如下:

func(15, 5); // works
func(15);    // works 

问题是:如果我删除可选参数的显式初始化,如下所示:

void func(int a, std::optional<int> b)

然后看起来函数的签名发生了变化

func(15, 5); // works
func(15);    // fails 

这让我对std::optional首先的目的感到非常困惑。如果不创建可选参数有什么好处?

4

3 回答 3

3

如果不创建可选参数有什么好处?

std::optional不应该用于您期望的可选参数;正如您的第一个代码示例所示,它需要默认参数std::optional,不会更改语言语法。

类模板std::optional管理一个可选的包含值,即可能存在也可能不存在的值。

你可以像这样使用它

void func(int a, std::optional<int> b = std::nullopt) {
    if (b) {
        // if b contains a value
        ...
    } else {
        ...
    }
}

然后

func(15, 5); // b will contain a value (i.e. `5`)
func(15);    // b doesn't contain a value
于 2018-11-14T00:42:48.167 回答
1

std::optional<int>尽管是“可选”的,但它仍然是一个具体类型,因此,除非您在函数规范中有默认值,否则您需要提供一个。

似乎在这里混淆了 optional 的两个定义:

  • 允许您存储对象或缺少对象的具体类型;和
  • 函数参数的可选性(如果这甚至是一个真实的词)。

它们不是同一件事。

于 2018-11-14T00:36:51.973 回答
1

另一个用途:可选的返回值:

// throws if cannot parse
auto parse_int(const std::string& s) -> int;

// returns std::nullopt if it cannot parse
auto try_parse_int(const std::string& s) -> std::optional<int>
于 2018-11-14T04:26:39.043 回答