我研究了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 […]
可能有一些我在标准中缺少解释这个行为的东西(或者我太累了,看不清楚),但我似乎找不到.
谢谢.