我需要在函数中使用默认值作为可选参数。当前签名看起来像这样:
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
的目的感到非常困惑。如果不创建可选参数,这有什么好处?
答案 0 :(得分:3)
如果不创建可选参数,这有什么用?
std::optional
不应用于期望的可选参数;如您的第一个代码示例所示,它需要default argument,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
答案 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?
}
}
}