10

我搜索了 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 更喜欢 using 声明。

我希望代码不会根据以下标准摘录进行编译。我预计会出现类似于“使用声明的目标与范围内的声明冲突”的错误。

7.1.3.6 类似地,在给定范围内,类或枚举不应使用与在该范围内声明的类型定义名称相同的名称来声明,并且该名称引用类或枚举本身以外的类型。

7.3.3.1 using-declaration 将名称引入到 using-declaration 出现的声明性区域中。

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

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

谢谢你。

4

1 回答 1

4

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

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

于 2013-02-27T23:04:17.460 回答