Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ typedef并在同一范围内使用相同名称的声明_C++_Typedef_Using Declaration - Fatal编程技术网

C++ typedef并在同一范围内使用相同名称的声明

C++ typedef并在同一范围内使用相同名称的声明,c++,typedef,using-declaration,C++,Typedef,Using Declaration,我浏览了C++11标准(n3242草案)和互联网,但没有找到准确的答案。下面的代码在Clang3.2和g++4.7.2以及VisualStudio2010中编译得很好,但我希望得到一个错误 #include <iostream> #include <typeinfo> typedef int a_t; namespace a_ns { class a_t {}; } using a_ns::a_t; int main() { a_t a;

我浏览了C++11标准(n3242草案)和互联网,但没有找到准确的答案。下面的代码在Clang3.2和g++4.7.2以及VisualStudio2010中编译得很好,但我希望得到一个错误

#include <iostream>
#include <typeinfo>


typedef int a_t;


namespace a_ns
{
class a_t {};
}


using a_ns::a_t;


int main()
{
    a_t a;
    std::cout << typeid(a).name() << std::endl;
    return 0;
}
clang和g++生成的可执行文件打印“i”,这似乎表明a是int类型,而typedef占优势。cl生成的可执行文件打印出“class a_ns::a_t”,这似乎表明Visual Studio更喜欢使用声明

我希望代码不会按照以下标准摘录编译。我预计会出现类似“使用声明的目标与范围中已存在的声明冲突”的错误

7.1.3.6类似地,在给定范围内,类或枚举的声明不得与中声明的typedef名称相同 该范围并引用类或枚举以外的类型 本身

7.3.3.1使用声明将名称引入使用声明出现的声明区域

7.3.3.2每个使用声明都是一个声明[…]

在解释这种行为的标准中,我可能遗漏了一些东西(或者我太累了,看不到明显的东西),但我似乎找不到


谢谢。

没错,您所显示的内容使代码无效。还有3.3.1p4使其无效(见7.3.3p13)


对于真实性测试,我使用ICC进行了测试,它按预期拒绝了它。

如果
main()
的主体为空,该程序也会无效吗?第7.1.3/6段规定“在给定范围内,不得使用typedef说明符重新定义在该范围内声明的任何类型的名称,以引用不同的类型。[示例:
class complex{/../};typedef int complex;//错误:重新定义
-结束示例]”。在问题中,
typedef
没有“重新定义”名称。当使用声明在
之后移动时,所有编译器都会发出一个错误。@根据我们找到的引号,如果main为空,它也将无效。那么,其他一些引用是否也适用则无关紧要。通常,
class a{}会重新定义名称;A型(首先它只是一个类名。然后它也是一个typedef名称。名称被重新定义,因为之后仍然只有一个名称,但它同时具有两个语法属性。这与C模型不同)。
clang -std=c++11 -pedantic -Wall -o a a.cpp -lstdc++
g++ -std=c++11 -pedantic -Wall -o a a.cpp -lstdc++
cl -EHsc -GR a.cpp