考虑以下程序:
extern int x;
auto x = 42;
int main() { }
Clang 3.5接受它(live demo),GCC 4.9和VS2013不接受(live demo for the former)。谁是对的,C++标准中规定的正确行为在哪里?
发布于 2018-09-14 14:39:01
我假设[dcl.spec.auto]p11中的限制是存在的,因为否则,它将允许:
int f();
auto f(); // What's the return type here?
问题是,你可以有一个未演绎的类型类型,有一个函数的返回类型。没有基于前面的声明的演绎规则,这就是为什么函数不允许这样的混合,即使以下是完全可以的:
int f();
auto f() { return 1; }
变量不存在此问题:
extern int v;
extern auto v; // ill-formed
任何仅限声明的变量都必须使用非占位符类型。这意味着,如果您使用占位符类型来定义v
,则可以毫无问题地推导出它,当然,还必须与第一个声明中使用的非占位符类型相匹配。
extern int v;
auto v = 1; // ok, type deduced as 'int', matches first declaration.
https://stackoverflow.com/questions/26386010
复制相似问题