Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用std::uint8\t作为键初始化映射时出现警告 问题_C++_Compiler Warnings_Literals - Fatal编程技术网

C++ 使用std::uint8\t作为键初始化映射时出现警告 问题

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明确地强制转换每个键 我对这两种方法都不是

我正在尝试创建std::uint8\u t->char的映射,并使用一些值初始化它:

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>);
}