make std :: необязательный конструктор генерирует неявные предупреждения преобразования - PullRequest
7 голосов
/ 11 апреля 2019

Я пытаюсь избавить свою кодовую базу от неявных преобразований с потерями, поэтому я компилирую с флагом -Wconversion в clang ++. Ожидается, что следующий код выведет предупреждение, но это не так.

#include <cstddef>
#include <iostream>
#include <limits>
#include <optional>


int main() {
  size_t x = std::numeric_limits<size_t>::max();
  std::cout << x << std::endl;

  auto x2 = std::make_optional<uint8_t>(x);
  std::cout << (int)*x2 << std::endl;

  return 0;
}

В строке make_optional мой size_t тихо сужается до uint8_t. Если вместо этого я напишу, например, uint8_t x2 = x;, я получу предупреждение об ожидаемом сужении конверсии.

Это также происходит, когда я использую конструктор std::optional. В приведенном мною коде вызывается перегрузка make_optional 2, которая вызывает необязательную перегрузку конструктора 6. Это создает необязательную, как если бы непосредственная инициализация содержавшегося значения, а прямая инициализация не вызывает неявное сужающее предупреждение о преобразовании.

Кроме написания собственного класса optional, который не скрывает сужающие преобразования, есть ли способ заставить приведенный выше код выдавать предупреждение о сужающемся преобразовании?

...