gpt4 book ai didi

c++ - 将 (uint8_t)0x00 附加到 std::string 会导致 cygwin 出现不明确的重载错误?

转载 作者:行者123 更新时间:2023-11-30 02:30:33 25 4
gpt4 key购买 nike

我是不是疯了,或者这是 cygwin g++ 编译器的错误?

这个有效:

std::string record;
record += (uint8_t)1;

附加一个值为 0 的 const 变量也很酷:

const uint8_t tZero = 0x00;
std::string record;
record += tZero;

但是,运行此代码会导致不明确的运算符重载错误:

std::string record;    
record += (uint8_t)0;

考虑到显式转换,它提供的候选项毫无意义,尤其是因为其中一个候选项似乎与错误中给出的完全相同:

sources/logger.cpp:55:20: error: ambiguous overload for `operator+=' (operand types are `std::string {aka std::basic_string<char>}' and `uint8_t {aka unsigned char}')
record += (const uint8_t)0;

note: candidates:
operator+=(const basic_string& __str)
operator+=(const _CharT* __s)
operator+=(_CharT __c)

这个错误也没有出现在 visual studio 中,它按照我的预期编译并附加了一个 0x00 字节。

作为引用,我使用字符串作为二进制日志数据的缓冲区。可能有更好的容器可以使用,但是能够 += 字节输入太有用了,不能没有。

cygwin 是否有其字符串实现的错误,或者这应该会导致错误,因为它是 0?我不介意使用 const 变量来修复错误,但它看起来很奇怪,因为这个过程在代码中用其他值重复了多次。

最佳答案

这是最近对 C++ 语言的更改。现在,您的代码应该调用 operator+=(_CharT)。过去,即使使用 const uint8_t tZero = 0x00;,您的代码也会因歧义而失败。您正在处理一个部分实现了该更改的编译器。

在更改语言之前,任何值为零的整数常量表达式都可以隐式转换为任何指针类型并产生空指针。这就是为什么 (uint8_t)0 可以转换为 charconst char *

现在,只有文字 0 可以转换为指针类型。 tZero,甚至 (uint8_t)0,不应再转换为 const char *。这解决了歧义:只有转换为 char 仍然是可能的。

关于c++ - 将 (uint8_t)0x00 附加到 std::string 会导致 cygwin 出现不明确的重载错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38510425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com