【发布时间】:2019-01-01 23:36:17
【问题描述】:
我对 C++ 很陌生,但我发现 auto 的这种行为很奇怪:
class A{};
int main() {
A a;
auto x = -(sizeof(a));
cout << x << endl;
return 0;
}
在这种情况下,变量 x 是 unsigned,尽管我在变量初始化时使用了一元减号运算符。为什么只考虑了sizeof(std::size_t)的返回类型,却没有考虑到因为使用了操作符而存储的数字会是负数?
我知道size_t 是一个无符号整数。
我已经在 GCC 8.1.0 和 C++17 中尝试过。
【问题讨论】:
-
为什么你会期待不同的东西?当您执行
cout << -(sizeof(a)) << endl;时,也会发生同样的事情。这与汽车无关。 -
因为 C 设计者希望
-在无符号值上有效。就我个人而言,我会使其无效。 -
这可能是对
auto的误解,它没有为 C++ 语言添加任何新内容,它使用了与模板参数类型推导语言中已经存在的机制完全相同的机制 -
@curiousguy 除了一元减号。通过说
0u - x,可以得到和-x一样的效果。也许我什至会禁止在运算符表达式中混合有符号/无符号。 IMO 仍然允许-1u.. 可能很有用,所以我可以添加一条规则,即无符号的一元减号仅允许在无符号的文字上使用,这类似于禁止在运算符表达式中混合符号。 -
@curiousguy 是的,因为环绕只是减法的一种特殊情况。只有当右边大于左边时,你才有环绕。另一方面,对于否定,环绕是大多数情况,只有
0是例外。