嗯,我只是在即将到来的C ++ 0x标准多个自动声明有点混乱。

auto a = 10, b = 3.f , * c = new Class();

某处我读它是不允许的。 原因是(?),因为它不清楚如果连续声明应具有(在示例INT)的相同类型的第一个的,或不

可能的翻译1:

int a = 10; 
int b = 3.f; 
int * c = new Class ();

导致错误

可能的翻译2:

int a = 10;
float b = 3.f;
Class * c = new Class (); 

它是如何导致标准?

如果我可以说我的POV,翻译#2是最obiouvs,至少对我来说,我是一个普通的C ++用户。我的意思是,对我来说“宣布所有的变量与声明的类型”,女巫是汽车。 翻译#1将是真正的非直观的给我。

再见 QbProg

有帮助吗?

解决方案

这可能不是最新的,但我的C ++从2008年6月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

所以,除非东西已经从六月改变,这是(或将要)允许在有限的形式与非常直观的解释。

的限制是,如果你想这样的字符串的多个自动声明(使用上面的例子),它的工作原理是因为推断类型vu的具有相同的“基本类型”(在这种情况下int)以使用不精确的术语。

如果你想要的精确规则,标准草案这样说:

  

如果声明符的列表中包含一个以上的说明符中,如所描述的确定的每个声明的变量的类型   以上。如果推导出的模板的参数U是不在各个扣相同的类型,该程序是非法的构造。

其中, “推定的模板参数U” 由下式确定:

  

在下面的发明函数模板的呼叫F(表达式)的推导的类型的参数的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?

在任何情况下,我不把多个声明在同一语句反正的风扇。

其他提示

href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2798.pdf" rel="nofollow noreferrer">标准草案中

有,我认为有助于促进目前的措辞几点。首先是一致性。如果编写声明如:

int j;
int i = 0, *k = &j;

然后,将两种类型的无论是在其类型使用 INT 某处。它是例如一个错误,如果“J”是“const int的”。拥有的汽车的工作同样是“一致的”用这种声明当前模型。

有然后,从编译器作者的透视一个实际的优点。已经存在于编译器来执行类型推导函数调用的机器(这是如何自动被描述为操作)。上述规则是与规则相一致,即扣除模板参数必须产生相同类型:

template <typename T> void foo (T, T*);

void bar ()
{
  int i;
  const int j = 0;

  foo (i, &i);  // OK deduction succeeds T == int
  foo (i, &j);  // ERROR deduction fails T == int or const int.
}

这是容易实施的自动是重用现有力学推断类型的自动,和因为与当前行为的一致性的结果也不会太令人惊讶的人。

最后,这大概是我认为最重要的一点。目前的模式是保守和非常相似的工作在C ++现有的语言结构。因此它造成了节目停止语言错误的机会非常渺茫。然而,目前的模型可以很容易地在未来扩展到包含你在你的问题列表中的其他例子。

更重要的是,该扩张不会打破使用的汽车的目前的措辞代码。试想,如果他们这样做倒过来。如果扩大版的汽车的是第一个版本,这导致与关键字一些奇怪的和致命的缺陷,那就需要从标准的去除语言特性 - 这几乎从未发生过的它最有可能断裂代码。

第一个将一种与类型推断的返回类型是如何工作的排队:?运营商

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top