c++ - 为什么我可以在私有(private)类型上使用 auto?

标签 c++ c++11 auto private-members

令我惊讶的是,以下代码可以编译并运行(vc2012 和 gcc4.7.2)

class Foo {
    struct Bar { int i; };
public:
    Bar Baz() { return Bar(); }
};

int main() {
    Foo f;
    // Foo::Bar b = f.Baz();  // error
    auto b = f.Baz();         // ok
    std::cout << b.i;
}

这段代码编译正常是否正确?为什么它是正确的?为什么我可以在私有(private)类型上使用 auto,而我不能使用它的名称(如预期的那样)?

最佳答案

auto 的规则在很大程度上与模板类型推导相同。发布的示例的工作原理与您可以将私有(private)类型的对象传递给模板函数的原因相同:

template <typename T>
void fun(T t) {}

int main() {
    Foo f;
    fun(f.Baz());         // ok
}

你问为什么我们可以将私有(private)类型的对象传递给模板函数?因为只有类型的名称是不可访问的。该类型本身仍然可用,这就是您完全可以将其返回给客户端代码的原因。

关于c++ - 为什么我可以在私有(private)类型上使用 auto?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48595214/

相关文章:

c++ - 为 iOS 4.x 使用 Boost 和 C++0x 方言

c++ - 绑定(bind)一个本身由 std::bind 创建的函数对象会造成麻烦

c++ - 迭代一对 vector 的简单方法

c++ - 将 auto 关键字替换为推导类型(clang 或 VS2010)

c++ - 构建成对 vector 时出现编译器错误

c++ - 未格式化/格式化输入

C/C++ 用不同的编译器编译程序的不同部分

c++ - 在 C++ 中使用 lambda 表达式和 auto 关键字时遇到问题

c++ - 正确处理有符号和无符号值的比较

c++ - 应用程序无法使用 libcurl C++ Windows 7 VS 2010 启动 (0xc0150002)