使std :: optional构造函数发出隐式转换警告

时间:2019-04-11 19:40:05

标签: c++ compiler-warnings implicit-conversion clang++

我正在尝试摆脱有损隐式转换的代码库,因此我在clang ++下使用-Wconversion标志进行编译。以下代码预期会输出警告,但不会输出。

#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,它调用了optional构造函数重载6。这构造了可选内容,就好像直接初始化包含的值一样,并且直接初始化不会引发隐式变窄转换警告。

除了编写自己的optional类不会隐藏缩小转换之外,还有什么方法可以使上述代码引发缩小转换警告?

0 个答案:

没有答案