c – typedef并在相同范围内使用同名的声明

我研究了C11标准(好吧,n3242草案)和互联网,但找不到确切的答案.下面的代码可以用clang 3.2和g 4.7.2以及Visual Studio 2010进行编译,但是我希望得到一个错误.
#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 -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

clang和g生成的可执行文件打印“i”,这似乎表明a是int类型,typedef占上风. cl生成可执行文件“class a_ns :: a_t”,这似乎表明Visual Studio更喜欢使用声明.

我希望代码不能按照以下标准摘录编译.我会期待一个类似于“已经在范围内使用声明冲突的声明”的错误.

7.1.3.6 Similarly,in a given scope,a class or enumeration shall not be declared with the same name as a typedef-name that is declared in
that scope and refers to a type other than the class or enumeration
itself.

7.3.3.1 A using-declaration introduces a name into the declarative region in which the using-declaration appears.

7.3.3.2 Every using-declaration is a declaration […]

可能有一些我在标准中缺少解释这个行为的东西(或者我太累了,看不清楚),但我似乎找不到.

谢谢.

解决方法

没错,你所显示代码无效.还有3.3.1p4也使它无效(见7.3.3p13).

对于现实测试,我用ICC测试,并按预期方式拒绝.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...