嗯,我对即将推出的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
它可能不是最新版本,但从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的类型:
Run Code Online (Sandbox Code Playgroud)`template <class U> void f(const U& u);`
为什么他们提出这个规则而不是说:
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)
无论如何,我不喜欢在同一个声明中放置多个声明.