C++ 使用std::uint8\t作为键初始化映射时出现警告 问题
我正在尝试创建std::uint8\u t->char的映射,并使用一些值初始化它:C++ 使用std::uint8\t作为键初始化映射时出现警告 问题,c++,compiler-warnings,literals,C++,Compiler Warnings,Literals,我正在尝试创建std::uint8\u t->char的映射,并使用一些值初始化它: const std::map<std::uint8_t, char> ScenarioReader::alphabet = { { 0x12, 'b' }, { 0x13, 'c' }, { 0x15, 'a' }, { 0x16, 'f' }, ... } 解决 我知道有两种可能的解决方法: 1禁用此部分的警告 2明确地强制转换每个键 我对这两种方法都不是
const std::map<std::uint8_t, char> ScenarioReader::alphabet = {
{ 0x12, 'b' },
{ 0x13, 'c' },
{ 0x15, 'a' },
{ 0x16, 'f' },
...
}
解决
我知道有两种可能的解决方法:
1禁用此部分的警告
2明确地强制转换每个键
我对这两种方法都不是特别满意,但第二种方法对我来说特别难看
也许我错过了一个更简单的解决方案吗?An永远不会是std::uint8\t。不使用静态_强制转换,您可以使用以下文字:
const std::map<std::uint8_t, char> alphabet = {
{ std::uint8_t(0x12), 'b' },
{ std::uint8_t(0x13), 'c' },
{ std::uint8_t(0x15), 'a' },
{ std::uint8_t(0x16), 'f' },
};
不能是std::uint8\t。不使用静态_强制转换,您可以使用以下文字:
const std::map<std::uint8_t, char> alphabet = {
{ std::uint8_t(0x12), 'b' },
{ std::uint8_t(0x13), 'c' },
{ std::uint8_t(0x15), 'a' },
{ std::uint8_t(0x16), 'f' },
};
该警告是错误的,仅在\W4警告级别发生 从文本到std::uint8_t的转换不应生成任何警告,除非该文本超出转换为类型的范围(此处不是这种情况) 我认为你选择的任何选项都可以。这归根结底是个人喜好的问题。我个人更喜欢std::uint8{0x12}语法
另一种选择是将一个警告级别降低到\W3,然后使用一个单独的过梁\W4,但大多数情况下都是这样。该警告是错误的,仅在\W4警告级别上发生 从文本到std::uint8_t的转换不应生成任何警告,除非该文本超出转换为类型的范围(此处不是这种情况) 我认为你选择的任何选项都可以。这归根结底是个人喜好的问题。我个人更喜欢std::uint8{0x12}语法
另一种选择是降低一个警告级别到\W3,然后使用一个单独的linter\W4,但大多数情况下都是这样。您可以编写一个用户定义的文本
#include <cstdint>
constexpr std::uint8_t operator "" _ui8(unsigned long long value)
{
return static_cast<std::uint8_t>(value);
}
#include <type_traits>
int main() {
static_assert(std::is_same_v<decltype(0x12_ui8), std::uint8_t>);
}
您可以编写一个用户定义的文本
#include <cstdint>
constexpr std::uint8_t operator "" _ui8(unsigned long long value)
{
return static_cast<std::uint8_t>(value);
}
#include <type_traits>
int main() {
static_assert(std::is_same_v<decltype(0x12_ui8), std::uint8_t>);
}
aa禁用和禁用警告很少有用。第二种方法在我看来是更好的。尽管它又大又丑,但它清楚地表达了你在做什么,并且你知道演员阵容是有效的。aa禁用警告很少有用。第二种方法在我看来是更好的。尽管它又大又丑,但它清楚地表达了你在做什么,并且你知道该转换是有效的。他可以编写一个用户定义的文本。你可能认为你在调用构造函数,但这是一个C风格的转换@AryanParekh no,那将是std::uint8_t0x12。@AryanParekh确实,这是一个强制转换,而不是对构造函数的调用。我相应地更新了我的答案。最后,我认为使用JHBonarius提到的用户定义文字似乎是最干净的解决方案。@Pierre,std::uint8中的std::part真的有必要吗?如果你包含,那么你应该可以访问类型uint8_t,而不使用名称。我认为在幕后有一个typedef std::uint8_t uint8_t。他可以编写一个用户定义的文字。你可能认为你在调用构造函数,但这是一个C风格的cast@AryanParekh no,那将是std::uint8_t0x12。@AryanParekh确实,这是一个强制转换,而不是对构造函数的调用。我相应地更新了我的答案。最后,我认为使用JHBonarius提到的用户定义文字似乎是最干净的解决方案。@Pierre,std::uint8中的std::part真的有必要吗?如果您包括,那么您应该可以访问类型uint8_t而不使用名称,我认为在幕后有一个typedef std::uint8_t uint8_t。
#include <cstdint>
constexpr std::uint8_t operator "" _ui8(unsigned long long value)
{
return static_cast<std::uint8_t>(value);
}
#include <type_traits>
int main() {
static_assert(std::is_same_v<decltype(0x12_ui8), std::uint8_t>);
}