Меняет ли std :: option сигнатуру функции? - PullRequest
0 голосов
/ 14 ноября 2018

Мне нужно сделать необязательный аргумент со значением по умолчанию в моей функции. На данный момент подпись выглядит примерно так:

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 голосов
/ 14 ноября 2018

Зачем это нужно, если не для создания необязательных аргументов?

std::optional не должен использоваться для необязательного аргумента, который вы ожидаете; который требует аргумент по умолчанию , как показал 1-й пример кода, std::optional не изменит синтаксис языка.

Шаблон класса std::optional управляет необязательным вложенным значением, то есть значением, которое может присутствовать или не присутствовать.

Вы можете использовать его как

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

1021 * тогда *

func(15, 5); // b will contain a value (i.e. `5`)
func(15);    // b doesn't contain a value
0 голосов
/ 14 ноября 2018

Другое использование: необязательные возвращаемые значения:

// 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>
0 голосов
/ 14 ноября 2018

std::optional<int> по-прежнему является конкретным типом, несмотря на то, что он является «необязательным», поэтому, если у вас нет значения по умолчанию для него в спецификации функций, вам необходимо указать его.

Вы кажутся чтобы объединить здесь два необязательных определения:

  • конкретный тип, позволяющий хранить объект или его отсутствие;и
  • возможность (если это даже реальное слово) аргументов функции.

Это не одно и то же.

...