是否可以在 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 执行以下操作?的主要内容,如果未能解决你的问题,请参考以下文章