是否可以在 C++0x 中使用 auto 执行以下操作?

Posted

技术标签:

【中文标题】是否可以在 C++0x 中使用 auto 执行以下操作?【英文标题】:Is it possible to do the following with auto in C++0x? 【发布时间】:2010-12-16 23:40:03 【问题描述】:

Eric Lippert 用 C# 写了一篇关于 Why no var on fields? 的文章。我很好奇,我们能在 C++0x 中做到这一点吗?例如。

struct mystruct_t

   auto i = 0, d = 0.0, s = std::string("zero");
;

我无法通过最新草稿找到答案,抱歉。

谢谢,

【问题讨论】:

我认为那里不允许使用 auto。但即使是这样,这也行不通,因为它会导致扣减失败。对于所有三种情况,“auto”必须是同一类型。 所以将它们放在单独的声明中可以吗?我的意思是,我们真的可以在我在示例中展示的结构中使用 auto 吗? 我不知道为什么这被否决了。这听起来像是一个有效的问题。 【参考方案1】:

很遗憾你不能。该规范在 7.1.6.4/3 中说明并遵循

否则,变量的类型是从它的初始化器推导出来的。被声明的变量的名称不应出现在初始化表达式中。在块 (6.3)、命名空间范围 (3.3.6) 和 for-init-statement (6.5.3) 中声明变量时,允许使用这种 auto。

auto 类型说明符也可用于在选择语句 (6.4) 或迭代语句 (6.5) 的条件中,在 new-type-id 或 type 中的 type-specifier-seq 中声明变量新表达式 (5.3.4) 的 -id,在 for-range-declaration 中,以及在声明带有大括号或等号初始化器的静态数据成员时,该初始化器出现在类定义的成员规范中 (9.4 .2)。

在本节未明确允许的上下文中使用 auto 的程序是格式错误的。

我不知道他们为什么禁止 auto 用于非静态数据成员,这会很方便。

【讨论】:

您的回答似乎比我的要好得多。我必须抽出时间阅读实际的 C++0x 规范... 编译器如何确定非静态“自动”成员的类型? @edA 来自他们的初始化程序,当然。您需要指定一个类内初始化程序,这在 C++0x 中是允许的。 啊,是的,从来没想过。再看更多,我发现这实际上是一个真正的愚蠢限制,因为decltype 似乎确实允许用于非静态数据成员!因此你不能定义这个宏:#define mem_auto( name, value ) decltype(value) name = value @edA 是的,我同意。更糟糕的是它并没有涵盖所有情况,所以有时你无法解决它。虽然允许auto x = [] ; (lambda),但不允许mem_auto(x, []); (lambda 不能出现在decltype 中)。

以上是关于是否可以在 C++0x 中使用 auto 执行以下操作?的主要内容,如果未能解决你的问题,请参考以下文章

C 的“auto”关键字的目标

C++0x 右值引用模板参数推导

c语言。 if(num&0x01),这个if语句里面判断的是啥?

以下程序中“0x80”和“0x40”代表啥意思?

以下程序中0x80和 0x40代表什么

可以在仅部分覆盖的情况下执行单字节指令吗?