"自动"类型推导编译,而显式类型给出错误

时间:2014-07-06 18:11:40

标签: c++ visual-studio-2012 auto

我正在使用Visual Studio 2012,我发现了一些奇怪的东西。我不是在编写一些我必须要兼容多个编译器的东西,但它可能会变得更晚(当代码放在web上时,用户不希望得到编译器错误),但我不想写这是错误的,或者只是不是原生的。

所以这是测试代码:

class A{
    class B{
        public:
        int i;
    };
    B myB;
public:
    B& getB() { return myB; }
};

int main()
{
    A a;
    A::B& b = a.getB();
    auto& b2 = a.getB();
}

主要弹出error C2248: 'A::B' : cannot access private class declared in class 'A'内的第一行,而第二行正常编译。我想知道,auto应该像这样工作还是Visual Studio中的另一个错误?

我没有任何其他编译器可以使用

进行测试

您甚至可以编写std::cout << b2.i << "\n";之类的内容,并且编译完全正确

根据πάνταῥεῖ的评论,我用gcc 4.8.1尝试了ideone,它以相同的方式编译,第一行是错误,第二行是完全正常的。

2 个答案:

答案 0 :(得分:10)

我相信它应该像那样工作。访问权限适用于名称,而不适用于它们所引用的实体。

即使没有auto,它仍然是合法的,例如将getB的结果传递给期望B的函数。

答案 1 :(得分:3)

auto应该像那样工作,是的,是的,这意味着它可以暴露私有类型。