std :: optional是否更改函数的签名?

时间:2018-11-14 00:34:28

标签: c++ c++17 stdoptional

我需要在函数中使用默认值作为可选参数。当前签名看起来像这样:

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的目的感到非常困惑。如果不创建可选参数,这有什么好处?

3 个答案:

答案 0 :(得分:3)

  

如果不创建可选参数,这有什么用?

std::optional不应用于期望的可选参数;如您的第一个代码示例所示,它需要default argumentstd::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

答案 1 :(得分:1)

std::optional<int>仍然是一个具体的类型,尽管它是“可选”的,所以,除非您在功能说明中为其具有默认值,否则需要提供一个。

似乎在这里要混淆可选的两个定义:

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

他们不是一回事。

答案 2 :(得分:1)

另一种用法:可选的返回值:

import java.lang.*;
import java.io.*;
import java.util.*;


public class anagram
{


    public static void main(String args[])
    {

        Scanner kbReader = new Scanner(System.in);
        System.out.println("Enter first word");
        String a = kbReader.next();
        System.out.println("Enter second word");
        String b = kbReader.next(); ///User inputs 2 strings, a and b
        a = a.toLowerCase();
        b = b.toLowerCase();

        int numA = a.length();
        int numB = b.length();

        if (numA != numB)
           System.out.println("NOT AN ANAGRAM"); 



        for(int i = 0;i < numA; i++) ///continues until all letters are used
        {
            String letter = b.substring(i,i++);
            int checker = a.indexOf(letter);///checks word a for every letter of b

            System.out.println(checker); ///always get 0 for this value, why never -1?



       }
   }


}