C++ 0x标准如何定义C++ Auto多重声明?

QbP*_*rog 2 c++ c++11

嗯,我对即将推出的C++ 0x标准中的多个自动声明有点混淆.

auto a = 10, b = 3.f , * c = new Class();
Run Code Online (Sandbox Code Playgroud)

在某处我读到它是不允许的.原因是(?)因为不清楚连续声明是否应该与第一个声明具有相同的类型(在示例中为int),或者不是.

可能的翻译1:

int a = 10; 
int b = 3.f; 
int * c = new Class ();
Run Code Online (Sandbox Code Playgroud)

导致错误

可能的翻译2:

int a = 10;
float b = 3.f;
Class * c = new Class (); 
Run Code Online (Sandbox Code Playgroud)

它是如何产生标准的?

如果我可以说我的POV,翻译#2是最常见的,至少在我看来我是一个普通的C++用户.我的意思是,对我来说"声明的每个变量都是相同的声明类型",女巫是自动的.翻译#1对我来说真的不直观.

再见QbProg

Mic*_*urr 6

它可能不是最新版本,但从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
Run Code Online (Sandbox Code Playgroud)

因此,除非从6月开始发生变化,否则这将是(或将会)以有限的形式进行,并且具有非常直观的解释.

限制是,如果你想要像这样串起多个自动声明(使用上面的例子),它的工作原理是因为推断类型v并且u具有相同的"基本类型"(在本例中为int)以使用不精确的术语.

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

如果声明符列表包含多个声明符,则每个声明的变量的类型如上所述确定.如果针对模板参数U推导出的类型在每个推导中不相同,则该程序是不正确的.

其中"推导出的模板参数U"由下式确定:

在下面发明的函数模板的调用f(expr)中推导出的参数u的类型:

 `template <class U> void f(const U& u);`
Run Code Online (Sandbox Code Playgroud)

为什么他们提出这个规则而不是说:

auto a = 10, b = 3.f , * c = new Class();
Run Code Online (Sandbox Code Playgroud)

相当于:

auto a = 10;
auto b = 3.f;
auto * c = new Class();
Run Code Online (Sandbox Code Playgroud)

我不知道.但我不写编译器.可能与您一旦弄清楚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?
Run Code Online (Sandbox Code Playgroud)

无论如何,我不喜欢在同一个声明中放置多个声明.