c++ - 使 std::optional 构造函数发出隐式转换警告
问题描述
我正在尝试摆脱有损隐式转换的代码库,因此我正在使用-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
线时,mysize_t
默默地缩小为uint8_t
. uint8_t x2 = x;
例如,如果我写,我会收到预期的缩小转换警告。
当我使用std::optional
构造函数时也会发生这种情况。在我给出的代码中,调用了make_optional重载 2,它调用了可选的构造函数重载 6。这构造了 optional,就好像直接初始化包含的值一样,并且直接初始化不会引发隐式缩小转换警告。
除了编写optional
我自己的不隐藏缩小转换的类之外,还有什么方法可以导致上述代码引发缩小转换警告?
解决方案
列表初始化禁止缩小转换。
顺便说一句,看起来有些编译器确实警告过这个问题:https ://godbolt.org/z/P8Mv8v83d
推荐阅读
- java - 从 C++ 到 C++ 回调的 Java 回调
- javascript - .Net:将值从 JavaScript 传递到 C# 而无需回发
- dfsort - 使用 JCL 屏蔽中间数字
- python - Python中的类问题连接SQL Server
- laravel - Laravel - 使用 php artisan make:migration 一次将两列添加到现有表中
- css - 使高度适应其内容
- javascript - 通过 Chrome 扩展程序避免跨域策略
- javascript - 我不断得到gt; 使用子字符串或切片时
- r - 对不同长度的数据帧求和
- mysql - 运行本地 MySQL 实例 + 连接到 Crystal Reports