Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.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++ `具有多字基本类型的auto`变量声明会导致错误_C++_C++11_Auto - Fatal编程技术网

C++ `具有多字基本类型的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关键字和由两个或多个单词组成的类型名声明变量

如果没有,为什么没有

比如说

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来表示类型它由多个单词描述…(我认为一个类型的大小大于一个寄存器)。所以,是的,解析是个问题。你在这里做的是转换。让我查一些官方文档。你可以,但你不应该!@EmilVatai
auto foo=0U
看起来很干净。为什么不呢?是的,这是“最合理的”,但我还是要说你不应该这样做。如果你想要一个
unsigned int
类型的
foo
变量,其值
0
,建议的方法是
unsigned int foo=0;
。问题更多的是关于这种语法为什么适用于类型
int
(用一个关键字描述)而非
unsigned int
(用多个关键字描述)。@EmilVatai,感谢您的帮助。我能够在标准中找到解释OP构造错误原因的参考。这在技术上是非标准的,编译器会警告您。@cpplearner感谢您的反馈。在答案中添加了这一点。
auto foo = 0u;