我仔细研究了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;
}
内置:
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类似地,在给定范围内,不应声明类或枚举与名称中声明的typedef-name相同的名称或枚举 该范围和引用类或枚举以外的类型 本身。
7.3.3.1 using声明在声明区域中引入了一个名称,其中出现了using声明。
7.3.3.2每个使用声明都是声明[...]
标准中可能缺少一些可以解释这种行为的东西(或者我太累了,看不清楚),但我似乎无法找到它。
谢谢。
答案 0 :(得分:4)
这是正确的,你所显示的内容使代码无效。还有3.3.1p4也使它无效(见7.3.3p13)。
对于现实测试,我使用ICC测试,并按预期拒绝它。