它可能不是最新的,但我 2008 年 6 月的 C++0x 标准草案说您可以执行以下操作:
auto x = 5; // OK: x has type int
const auto *v = &x, u = 6; // OK: v has type const int*, u has type const int
因此,除非从 6 月开始发生变化,否则(或将)以有限的形式允许使用非常直观的解释。
限制是,如果您确实想像这样(使用上面的示例)对多个自动声明进行字符串化,它会起作用,因为推断的类型v
和u
具有相同的“基本类型”(在这种情况下为 int)使用不精确的术语。
如果您想要精确的规则,标准草案是这样说的:
如果声明符列表包含多个声明符,则每个声明变量的类型都按上述方式确定。如果每次推导时为模板参数 U 推导的类型都不相同,则程序是非良构的。
其中“推导出的模板参数 U”由下式确定:
以下发明的函数模板的调用 f(expr) 中参数 u 的推导类型:
`template <class U> void f(const U& u);`
为什么他们提出了这条规则,而不是说这样的话:
auto a = 10, b = 3.f , * c = new Class();
相当于:
auto a = 10;
auto b = 3.f;
auto * c = new Class();
我不知道。但我不写编译器。可能与您确定auto
关键字替换后有关,您不能在同一语句中更改它。
举个例子:
int x = 5;
CFoo * c = new CFoo();
auto a1 = x, b1 = c; // why should this be permitted if
int a2 = x, CFoo* b2 = c; // this is not?
无论如何,无论如何,我都不喜欢在同一个语句上放置多个声明。