是否可以将变量重新声明为推导为相同类型的自动变量
Can a variable be redeclared as auto that deduced to the same type?
标准允许以下内容吗?
#include <iostream>
extern int a;
auto a = 3;
int main(int, char**)
{
std::cout << a << std::endl;
return 0;
}
叮当接受代码。G++ 抱怨声明冲突。
从标准中我不太清楚,但是,有这个写的
第 7.1.6.4 节 自动说明符
在本节中未明确允许的上下文中使用 auto 的程序格式不正确。
最好阅读所有允许上下文的标准中提到的部分。
考虑到这一点,我认为g++是正确的,而clang是错误的。但我可能是错的,标准中可能有一些单独的部分可能暗示了这种上下文,但我找不到它。
编辑答案:正如评论中提到的。在这种情况下,问题是写作
external int a;
auto a = 3;
和写作一样
external int a;
int a = 3;
这意味着您有一个新的 a 定义,这会导致错误。
第一个答案:据我了解,这打破了"一个定义"规则的一部分。具体来说,我指的是以下规则(参考MISRA C++ 2008),即具有外部链接的标识符应始终只有一个定义。在您的示例中,您在当前文件( auto a = 3;
) 中有一个定义,对于外部文件,您还引用另一个文件中的定义。
相关文章:
- 在 lambda 捕获中声明的变量的类型推导
- 是否可以在不使用 decltype 的情况下推断先前定义的 extern 变量的类型
- 常量成员函数中成员变量的类型
- 如何使用 ifstream 检查文件中变量的类型?
- 如何在c++中检查变量的类型
- std::enable_if 更改成员 *变量* 声明/类型
- 从迭代器转换为变量的类型.(C++11 模板)
- 根据模板函数类型推断变量的类型
- 如何在C++中接收任何类型的函数参数并获取函数内传递变量的类型?
- 动态更改/选择类成员变量的类型
- 当函数采用右值引用时,函数中该变量的类型是什么?
- 具有变量返回类型的函数
- 如何对lambda中捕获的变量的类型进行明确说明
- 为 具有"end"成员变量的类型启用基于范围的
- 如何在一行中从不同的变量(数据类型)创建一个字符数组?
- 从保存变量数据类型的数据结构中检索值,而不指定返回类型
- 错误:变量的类型不完整'introstructions'无法理解
- 根据成员变量的类型是否存在,有条件地定义该变量
- 带有 QVariant 和模板的变量返回类型
- 是否有任何方法可以在初始化之前更改变量的类型,您可以用示例解释