C++ `具有多字基本类型的auto`变量声明会导致错误
是否可以使用auto关键字和由两个或多个单词组成的类型名声明变量 如果没有,为什么没有 比如说C++ `具有多字基本类型的auto`变量声明会导致错误,c++,c++11,auto,C++,C++11,Auto,是否可以使用auto关键字和由两个或多个单词组成的类型名声明变量 如果没有,为什么没有 比如说 auto-foo=unsigned int{0} 给出以下编译器输出 叮当声: 错误:函数样式转换或类型构造应为“(” 通用条款: 错误:在的“unsigned”之前应包含主表达式 auto foo = T{0}; 要工作,T必须是一个简单的类型说明符 从 类似地,后跟a的或typename说明符创建指定类型的临时对象direct list initialized(),其值是作为prvalue的临时
auto-foo=unsigned int{0}代码>
给出以下编译器输出
叮当声:
错误:函数样式转换或类型构造应为“(”
通用条款:
错误:在的“unsigned”之前应包含主表达式
auto foo = T{0};
要工作,T
必须是一个简单的类型说明符
从
类似地,后跟a的或typename说明符创建指定类型的临时对象direct list initialized(),其值是作为prvalue的临时对象
如果您看到的定义,unsigned int
不是其中之一
您可以使用以下任一选项:
auto foo = 0U;
auto foo = (unsigned int)0;
auto foo = static_cast<unsigned int>(0);
autofoo=0U;
自动foo=(无符号整数)0;
自动foo=静态_转换(0);
每当您希望编译器对多个内容进行分组但它没有分组时,您可以使用括号强制它:
auto foo = (unsigned int)(0);
注意到,如果你使用卷舌代替,它被视为A,而不是合法的C++,虽然合法C99:< /P>
auto foo = (unsigned int){0}; /* Not legal C++, though GCC and Clang support it. */
在任何情况下,更好的解决方案是使用:
您要查找的内容可能在这里(“类型转换”部分)
也许这更好:在这个链接下,您正在使用语法(5):new_type{expression list(可选)}
因此,如果您的类型名中有一个空格,编译器将如何猜测无符号int{0}
是(无符号int{0}
(您可能的意思),还是(unsigend(int{0}))
(实际上是两次转换)…因此您必须显式地将类型名放入括号中
如果您想执行长无符号{x}
,这将非常重要,因为这样会导致
long
如果它被解释为long(无符号{x})
unsigned long
如果它被解释为(long unsigned){x}
为什么要这样做?auto
的全部思想不是编写类型。如果您想声明某些内容(第一次使用类型和全部)您使用的是正常的声明unsigned int foo=0;
。如果您使用auto bar=foo;
来遵循这一点,那么一切都应该是好的。@Emil Vatai我同意,但是有没有一个很好的理由说明在处理其他基本类型时不允许这样做?它太复杂而无法解析吗?即使不是“最佳实践”,这个问题仍然存在。没有,这与“最佳实践”相去甚远。“其他基本类型”是什么意思?请尝试删除int
(程序的含义/语义不会改变,因为unsigned
与unsigned int
相同)看看它是否编译。这应该让你更接近答案。看看cppreference.com上的“基本类型”页面。类似于long double
的东西在这种情况下不起作用,你可以使用L
后缀或cast,但我想知道为什么不允许使用这种语法。啊……好吧,用mult-word来表示类型它由多个单词描述…(我认为一个类型的大小大于一个寄存器)。所以,是的,解析是个问题。你在这里做的是转换。让我查一些官方文档。你可以,但你不应该!@EmilVataiauto foo=0U
看起来很干净。为什么不呢?是的,这是“最合理的”,但我还是要说你不应该这样做。如果你想要一个unsigned int
类型的foo
变量,其值0
,建议的方法是unsigned int foo=0;
。问题更多的是关于这种语法为什么适用于类型int
(用一个关键字描述)而非unsigned int
(用多个关键字描述)。@EmilVatai,感谢您的帮助。我能够在标准中找到解释OP构造错误原因的参考。这在技术上是非标准的,编译器会警告您。@cpplearner感谢您的反馈。在答案中添加了这一点。
auto foo = 0u;