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

ste*_*yfx 10 c++ typedef using-declaration

我仔细研究了C++ 11标准(以及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;
}
Run Code Online (Sandbox Code Playgroud)

内置:

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
Run Code Online (Sandbox Code Playgroud)

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

我希望代码不要按照以下标准摘录编译.我希望类似于"使用声明的目标与已经在范围内的声明冲突"的错误.

7.1.3.6类似地,在给定的范围内,类或枚举不应声明与在该范围内声明的typedef-name具有相同的名称,并且引用除类或枚举本身以外的类型.

7.3.3.1 using声明在声明区域中引入了一个名称,其中出现using声明.

7.3.3.2每份使用声明均为声明[...]

标准中可能缺少一些可以解释这种行为的东西(或者我太累了,看不到明显的),但我似乎无法找到它.

谢谢.

Joh*_*itb 4

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

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