gpt4 book ai didi

c++ - 在 C++ 中使用 T1 = unsigned T2 的奇怪结果

转载 作者:行者123 更新时间:2023-12-03 07:53:27 25 4
gpt4 key购买 nike

下面的代码让我感到困惑。

https://godbolt.org/z/WcMTYM1q7

#include <iostream>

using ll = long long;
using ull = unsigned ll;

int main() {
ull x = 0;
std::cout << x << std::endl;
}

此代码在 g++ 11 中无法编译,但在 g++ 12 和 g++ 13 中成功编译。在 g++ 11 中,编译器显示:

error: ambiguous overload for 'operator<<' (operand types are 'std::ostream' {aka 'std::basic_ostream<char>'} and 'ull' {aka 'long unsigned int'})

我还测试了以下代码。

https://godbolt.org/z/PrePfoa6E

#include <iostream>

using ll = long long;
using ull = unsigned ll;
using ull2 = std::make_unsigned_t<ll>;

int main() {
std::cout << typeid(ll).name() << std::endl;
std::cout << typeid(ull).name() << std::endl;
std::cout << typeid(ull2).name() << std::endl;
}

使用g++ 13编译代码时,会打印xjy,分别表示long longunsigned intunsigned long long。当使用g++ 11编译代码时,它会打印xmy,这意味着long longunsigned longunsigned long long。总而言之,unsigned ll 不是预期的类型。

为什么会发生这种情况?这是编译器错误吗?我什么时候应该使用std::make_unsigned

最佳答案

using ull = unsigned ll; 不是有效的标准 C++。您不能将像 unsigned 这样的类型说明符添加到像 ll 这样的 typedef 名称中。这仅适用于 cv 限定符,即 constvolatile,而不适用于其他改变类型的限定符,例如 unsigned

编译器应该对此代码发出诊断,GCC 可以使用 -pedantic-pedantic-errors 正确执行此操作。

它在没有这些标志的情况下进行编译,但在没有这些标志的情况下进行编译,表明接受此声明可能是一种预期的不符合标准的行为,在这种情况下,没有理由假设 unsigned ll 将是 unsigned long long 缺少文档这么说。

The documentation mentions该语法在 K&R C 中允许用于 typedef,但在 ISO C 中不允许。大概这是为了 K&R C 兼容性而保留的,其中 long longunsigned long long 不存在,因此此语法似乎未按这些类型的预期实现。而且 C++11 using 声明基本上只是 typedef 的语法糖,因此该行为可能取自 typedef 行为,即使这对于兼容性没有意义。 -pedantic-errors 强制执行标准一致性,因此不再允许此兼容性功能。

但是,GCC 11 的重载解析失败对我来说似乎是无意的,可以解释为后续版本中修复的错误。

关于c++ - 在 C++ 中使用 T1 = unsigned T2 的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76597855/

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